Skip to main content
 首页 » 编程设计

asp.net之iOS 8/Safari 8无法与ASP.NET AJAX扩展一起使用

2024年09月03日12jirigala

iOS 8推出后,我们的网站突然停止工作。
从ASP.NET UpdatePanel内部进行的每个回发都将导致一个空白页。
如果在Safari 8(在Mac上)中将用户代理设置为“Chrome”,它仍然可以工作。

我已经跟踪到,根本没有加载某些“ScriptResource.axd”和“WebResource.axd”文件。
还会出现一个错误消息,提示“Sys.WebForms”未定义(可能是由于缺少脚本文件)。

我们正在使用带有AJAX扩展1.0的ASP.NET 2.0(我知道,已经很过时了。但是以前可以工作,或者到目前为止可以修复)。

请您参考如下方法:

请注意,此解决方案仅适用于.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;英特尔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引起的。

该错误位于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>