iOS 8/Safari 8无法使用ASP.NET AJAX-Extensions

Tob*_*s81 33 asp.net ajax ios8 safari8

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

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

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

Tob*_*s81 57

请注意,此解决方案仅适用于.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;
Run Code Online (Sandbox Code Playgroud)

MinimumEcmaScriptVersion/MinimumW3CDomVersion都是1. Request.Browser给了我以下结果:

W3CDomVersion = 1.0
EcmaScriptVersion = 1.0
SupportsCallback = false
Run Code Online (Sandbox Code Playgroud)

即使"EcmaScriptVersion"有一个奇怪的值,问题主要是由SupportsCallback beeing引起的.

错误在于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>
Run Code Online (Sandbox Code Playgroud)

比"Safari 85"更新的东西意味着最后的定义.但由于乱七八糟的正则表达式,"Safari 600"被错误地检测为"Safari60":

<capability name="appleWebTechnologyVersion" match="60" />
Run Code Online (Sandbox Code Playgroud)

本来应该

<capability name="appleWebTechnologyVersion" match="60$" />
Run Code Online (Sandbox Code Playgroud)

我通过向我的应用程序添加自定义文件"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>
Run Code Online (Sandbox Code Playgroud)

  • 要保存阅读上述链接的人,您需要"触摸"(即编辑并保存)/ App_Browsers文件夹中的任何其他文件,以便触发您的新.browser文件被拾取. (7认同)
  • @stoj:我做错了,这里是正确的评论,谢谢!我还建议,如果您决定更改原始的mozilla.browser文件,执行命令:\ WINDOWS\Microsoft.NET\Framework \\ aspnet_regbrowsers.exe -i它会重新编译规则.此解决方案中解释的规则适用于框架版本2.0.这是链接http://msdn.microsoft.com/en-US/library/ms229858(v=vs.80).aspx (2认同)