【问题标题】:iOS 8 / Safari 8 not working with ASP.NET AJAX-ExtensionsiOS 8 / Safari 8 不适用于 ASP.NET AJAX 扩展
【发布时间】:2014-11-16 16:40:12
【问题描述】:

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

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

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

【问题讨论】:

  • 希望我昨天能找到这篇文章 - 我只是来写完全一样的东西。

标签: asp.net ajax ios8 safari8


【解决方案1】:

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

原来是这样……

工作 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, 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>

【讨论】:

  • 另外值得注意的是forums.asp.net/t/955969.aspx?Mastering+Browser+Definition+Files 中报告的错误,它可以阻止您的其他浏览器文件被拾取。
  • 要保存阅读上述链接的人,您需要“触摸”(即编辑和保存)/App_Browsers 文件夹中的任何其他文件,以触发新的 .browser 文件被拾取。
  • 我有一个客户对此有疑问。我想在我自己的机器上测试和修复,但由于某种原因我没有问题。我检查了 mozilla.browser ,这是不正确的,我在 App_Browsers 或 web.config 中没有任何东西可以解决这个问题。还有什么可以覆盖 mozilla.browser 文件?
  • 进一步的线索是,如果我将修复程序添加到 App_Browsers 文件夹(即使需要修复程序),我会收到以下错误消息:“ID 为 'Safari60' 的浏览器或网关元素不能找到了。”
  • @stoj :我打错了,这是正确的评论,谢谢!我还建议,如果您决定更改原始 mozilla.browser 文件,请执行以下命令:\WINDOWS\Microsoft.NET\Framework\\aspnet_regbrowsers.exe -i 它会重新编译规则。此解决方案中解释的规则适用于框架版本 2.0。这是链接msdn.microsoft.com/en-US/library/ms229858(v=vs.80).aspx
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我实现了@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>
    

    【讨论】:

    • 在我的应用程序中,asp.net 验证不适用于 Apple IOS8 和 MAC safari。真的上面的帮助对我很有用。它现在也支持 Apple IOS8 和 MAC safari。
    • 这适用于旧版本的 IOS(如 8),但不适用于最新的 IOS 9.1。请帮忙....
    • 问题已通过将匹配值替换为“AppleWebKit/601”得到解决。它在最新的 IOS 9.1 上运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多