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; 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;
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>