Подтвердить что ты не робот

IOS 8/Safari 8 не работает с ASP.NET AJAX-расширениями

Наш сайт внезапно прекратил работу, когда был выпущен iOS 8. Каждый пост-обратно из ASP.NET UpdatePanel приводит к пустой странице. Он по-прежнему работает, если пользовательский агент установлен в "Chrome" из Safari 8 (на Mac).

Я уже отслеживал, что некоторые из файлов "ScriptResource.axd" и "WebResource.axd" вообще не загружаются. Также имеется сообщение об ошибке "Sys.WebForms" undefined (возможно, из-за отсутствия script файлов).

Мы используем ASP.NET 2.0 с AJAX-Extensions 1.0 (я знаю, довольно устаревший, но использовался для работы или мог быть исправлен до сих пор).

4b9b3361

Ответ 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>

Ответ 2

Проблема воспроизводится только тогда, когда вы используете функцию пользовательского браузера, т.е. у вас есть файлы .browser в папке \App_Browsers. Причина в том, что: Microsoft однажды выпустила исправление (подробнее см. http://support.microsoft.com/kb/2836946), в котором рассматриваются некоторые проблемы с возможностями браузера, включая проблему, которую мы видим Вот; однако исправление не будет действовать, если вы используете функцию пользовательских возможностей браузера из-за проблем с совместимостью. Таким образом, для тех, кто использует пользовательские файлы возможностей браузера, к сожалению, лучший способ разрешить сообщаемую проблему - принять обходное решение, предоставленное Tobias81.

Ответ 3

Я реализовал решение, упомянутое выше, с помощью @Tobias81, и я получил сообщение "Ошибка браузера или шлюза с идентификатором" Safari60 ". Поэтому я исправил проблему, изменив элемент в моем приложении web.config, чтобы соответствовать новой версии и назначить правильные возможности.

<configuration>   
  <system.web>     
    <browserCaps>       
      <filter>
        <case match="AppleWebKit/600">EcmaScriptVersion = 1.5           
          supportsCallback = true         
        </case>       
      </filter>     
    </browserCaps>   
  </system.web>
</configuration>