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)