33

iOS 8 が公開されたときに、当社の Web サイトが突然機能しなくなりました。ASP.NET UpdatePanel 内からのすべてのポストバックは、空のページにつながります。ユーザーエージェントが Safari 8 (Mac の場合) 内から「Chrome」に設定されている場合は、引き続き機能します。

「ScriptResource.axd」および「WebResource.axd」ファイルの一部がまったくロードされていないことをすでに追跡しました。「Sys.WebForms」が未定義であることを示すエラーもあります (おそらくスクリプト ファイルが見つからないため)。

私たちはAJAX-Extensions 1.0でASP.NET 2.0を使用しています(私は知っていますが、かなり時代遅れです。しかし、以前は機能していたか、今まで修正できました)。

4

3 に答える 3

57

このソリューションは、.NET バージョン < 4.0 にのみ適用されることに注意してください。

だからここにある...

動作するUA: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (Gecko のような KHTML) Chrome/29.0.1547.57 Safari/537.36

動作しない UA: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (Gecko のような KHTML) バージョン/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>
于 2014-09-22T16:50:57.977 に答える
3

この問題は、カスタム ブラウザ機能を使用している場合、つまり \App_Browsers フォルダに .browser ファイルがある場合にのみ再現します。その理由は次のとおりです。マイクロソフトは、ここで見られる問題を含むいくつかのブラウザー機能の問題に対処する修正プログラムをリリースしました (詳細については、 http://support.microsoft.com/kb/2836946を参照してください)。ただし、互換性の問題により、カスタム ブラウザー機能機能を使用する場合、修正は有効になりません。したがって、カスタム ブラウザ機能ファイルを使用している場合、残念ながら、報告された問題を解決する最善の方法は、Tobias81 が提供する回避策を採用することです。

于 2015-01-06T22:57:50.150 に答える