请注意,此解决方案仅适用于 .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 导致的。
这个 bug 存在于随 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,}$" />
</identification>
<capabilities>
<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,}$" />
</identification>
<capabilities>
<capability name="ecmascriptversion" value="1.4" />
<capability name="w3cdomversion" value="1.0" />
<capability name="supportsCallback" value="true" />
</capabilities>
</browser>
</browsers>