Beware that this solution is only applicable to .NET version < 4.0
So here it is…
Working UA: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Not working 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
The problem lies in the major version-change to AppleWebKit/600.
ASP.NET AJAX does not correctly recognize the new Safari 8 browser (also with iOS 8).
It thinks, that there is no support for partial-rendering.
I found it in those lines from “PageRequestManager.cs”:
bool supportsPartialRendering = (browser.W3CDomVersion >= MinimumW3CDomVersion) && (browser.EcmaScriptVersion >= MinimumEcmaScriptVersion) && browser.SupportsCallback;
MinimumEcmaScriptVersion/MinimumW3CDomVersion are both 1.
Request.Browser gave me the following result:
W3CDomVersion = 1.0
EcmaScriptVersion = 1.0
SupportsCallback = false
Even though “EcmaScriptVersion” has a strange value, the problem is mainly caused by SupportsCallback beeing false.
The bug lies in the “mozilla.browser” file that ships with ASP.NET (located somewhere in “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>
Everything newer than “Safari 85” was meant to be catched by the last definition.
But due to a messed-up regular expression, “Safari 600” is falsly detected as “Safari60”:
<capability name="appleWebTechnologyVersion" match="60" />
Should have been
<capability name="appleWebTechnologyVersion" match="60$" />
I resolved this issue by adding a custom file “App_Browsers\safari.browser” to my application with the following content:
<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>