请注意,此解决方案仅适用于 .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>