Ответ 1
Остерегайтесь того, что это решение применимо только к версии .NET < 4,0
Итак, вот оно...
Рабочий UA: Mozilla/5.0 (Windows NT 6.2, WOW64) AppleWebKit/537.36 (KHTML, например, Gecko) Chrome/29.0.1547.57 Safari/537.36
Не работает UA: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, например, Gecko) Версия /7.1 Safari/537.85.10
Проблема заключается в основной версии - смена AppleWebKit/600. ASP.NET AJAX неправильно распознает новый браузер Safari 8 (также с iOS 8). Он считает, что поддержка частичного рендеринга отсутствует. Я нашел его в этих строках из "PageRequestManager.cs":
bool supportsPartialRendering = (browser.W3CDomVersion >= MinimumW3CDomVersion) && (browser.EcmaScriptVersion >= MinimumEcmaScriptVersion) && browser.SupportsCallback;
MinimumEcmaScriptVersion/MinimumW3CDomVersion равны 1. Request.Browser дал мне следующий результат:
W3CDomVersion = 1.0
EcmaScriptVersion = 1.0
SupportsCallback = false
Несмотря на то, что "EcmaScriptVersion" имеет странное значение, проблема в основном связана с тем, что SupportsCallback beeing false.
Ошибка находится в файле "mozilla.browser", который поставляется с ASP.NET(находится где-то в "C:\Windows\Microsoft.NET" ):
<browser id="Safari60" parentID="Safari">
<identification>
<capability name="appleWebTechnologyVersion" match="60" />
</identification>
<capture>
</capture>
<capabilities>
<capability name="ecmascriptversion" value="1.0" />
</capabilities>
</browser>
<browser id="Safari85" parentID="Safari">
<identification>
<capability name="appleWebTechnologyVersion" match="85" />
</identification>
<capture>
</capture>
<capabilities>
<capability name="ecmascriptversion" value="1.4" />
</capabilities>
</browser>
<browser id="Safari1Plus" parentID="Safari">
<identification>
<capability name="appleWebTechnologyVersion" match="\d\d\d" />
</identification>
<capture>
</capture>
<capabilities>
<capability name="ecmascriptversion" value="1.4" />
<capability name="w3cdomversion" value="1.0" />
<capability name="supportsCallback" value="true" />
</capabilities>
</browser>
Все новое, чем "Safari 85", предназначалось для определения последнего определения. Но из-за испорченного регулярного выражения "Safari 600" ошибочно определяется как "Safari60":
<capability name="appleWebTechnologyVersion" match="60" />
Должно быть
<capability name="appleWebTechnologyVersion" match="60$" />
Я решил эту проблему, добавив к моему приложению специальный файл "App_Browsers\safari.browser" со следующим содержимым:
<browsers>
<browser id="Safari60_bugfix" parentID="Safari60">
<identification>
<capability name="appleWebTechnologyVersion" match="^\d{3,}$" /> <!-- At least 3 digits -->
</identification>
<capabilities>
<!-- Same as in "Safari1Plus" -->
<capability name="ecmascriptversion" value="1.4" />
<capability name="w3cdomversion" value="1.0" />
<capability name="supportsCallback" value="true" />
</capabilities>
</browser>
<browser id="Safari85_bugfix" parentID="Safari85">
<identification>
<capability name="appleWebTechnologyVersion" match="^\d{3,}$" /> <!-- At least 3 digits -->
</identification>
<capabilities>
<!-- Same as in "Safari1Plus" -->
<capability name="ecmascriptversion" value="1.4" />
<capability name="w3cdomversion" value="1.0" />
<capability name="supportsCallback" value="true" />
</capabilities>
</browser>
</browsers>