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>
Другие вопросы по тегам