iOS 8 / Safari 8 не работает с ASP.NET AJAX-расширениями
Наш сайт внезапно перестал работать, когда iOS 8 был выпущен. Каждый постбэк из ASP.NET UpdatePanel ведет к пустой странице. Это все еще работает, если пользовательский агент установлен в "Chrome" из Safari 8 (на Mac).
Я уже отследил, что некоторые файлы "ScriptResource.axd" и "WebResource.axd" не загружаются вообще. Существует также ошибка, сообщающая, что "Sys.WebForms" не определено (возможно, из-за отсутствующих файлов скриптов).
Мы используем ASP.NET 2.0 с AJAX-Extensions 1.0 (я знаю, довольно устарел. Но работал или мог быть исправлен до сих пор).
3 ответа
Помните, что это решение применимо только к.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. Запрос. Браузер дал мне следующий результат:
W3CDomVersion = 1.0
EcmaScriptVersion = 1.0
SupportsCallback = false
Хотя "EcmaScriptVersion" имеет странное значение, проблема в основном вызвана ошибкой SupportsCallback.
Ошибка заключается в файле "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>
Эта проблема воспроизводится только в том случае, если кто-то использует функцию настраиваемого браузера, т. Е. У него есть файлы.browser в его / ее папке \App_Browsers. Причина в том, что: Microsoft однажды выпустила исправление (см. http://support.microsoft.com/kb/2836946 для получения более подробной информации), которое решало некоторые проблемы с возможностями браузера, включая проблему, которую мы видим здесь; однако исправление не будет действовать, если использовать функцию настраиваемого браузера из-за проблем совместимости. Таким образом, для тех, кто использует пользовательские файлы возможностей браузера, к сожалению, лучший способ решить описанную проблему - это использовать обходной путь, предоставленный Tobias81.
Я реализовал решение, упомянутое выше @Tobias81, и получил ошибку "Невозможно найти элемент браузера или шлюза с идентификатором" Safari60 "". Поэтому я исправил проблему, изменив элемент в файле web.config моего приложения, чтобы он соответствовал более новой версии и назначил правильные возможности.
<configuration>
<system.web>
<browserCaps>
<filter>
<case match="AppleWebKit/600">EcmaScriptVersion = 1.5
supportsCallback = true
</case>
</filter>
</browserCaps>
</system.web>
</configuration>