33

当 iOS 8 推出时,我们的网站突然停止工作。来自 ASP.NET UpdatePanel 的每个回发都会导致一个空页面。如果用户代理从 Safari 8(在 Mac 上)中设置为“Chrome”,它仍然有效。

我已经追踪到,一些“ScriptResource.axd”和“WebResource.axd”文件根本没有加载。还有一个错误告诉“Sys.WebForms”未定义(可能是由于缺少脚本文件)。

我们正在使用带有 AJAX-Extensions 1.0 的 ASP.NET 2.0(我知道,已经过时了。但以前可以工作或可以修复到现在)。

4

3 回答 3

57

请注意,此解决方案仅适用于 .NET 版本 < 4.0

所以这里...

工作 UA:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like 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, like Gecko) Version/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 为 false 引起的。

该错误位于 ASP.NET 附带的“mozilla.browser”文件中(位于“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>
于 2014-09-22T16:50:57.977 回答
3

只有当一个人使用自定义浏览器功能特性时,该问题才会重现,即一个人在他/她的 \App_Browsers 文件夹中有 .browser 文件。原因是:Microsoft 曾经发布了一个修复程序(有关更多详细信息,请参见http://support.microsoft.com/kb/2836946),该修复程序解决了一些浏览器功能问题,包括我们在此处看到的问题;但是,由于兼容性问题,当使用自定义浏览器功能特性时,该修复不会生效。因此,不幸的是,对于使用自定义浏览器功能文件的任何人来说,解决报告的问题的最佳方法是采用 Tobias81 提供的解决方法。

于 2015-01-06T22:57:50.150 回答
2

我实现了@Tobias81 上面提到的解决方案,但出现“找不到 ID 为 'Safari60' 的浏览器或网关元素”错误。因此,我通过更改应用程序 web.config 中的元素以匹配较新版本并分配正确的功能来解决此问题。

<configuration>   
  <system.web>     
    <browserCaps>       
      <filter>
        <case match="AppleWebKit/600">EcmaScriptVersion = 1.5           
          supportsCallback = true         
        </case>       
      </filter>     
    </browserCaps>   
  </system.web>
</configuration>
于 2015-03-02T20:28:29.607 回答