1. ホーム
  2. javascript

[解決済み] Internet ExplorerがAjax呼び出しに失敗した後、HTTPポストボディを送信しないのはなぜですか?

2022-09-04 16:58:38

質問

以下のシナリオを確実に再現することができます。

  1. サーバーに AJAX リクエストを行う小さな HTML ページを作成します (HTTP POST を使用します)。
  2. ネットワークから切断し、再接続する
  3. 障害発生後に IE が生成するパケットを監視する。

ネットワーク接続に失敗した後、IE は次の AJAX リクエストを作成しますが、その際に送信するパケットは HTTP ヘッダー (を送信するだけです(ボディは送信しません)。これは、部分的なリクエストに過ぎないため、サーバー上であらゆる種類の問題を引き起こします。Bing でこの問題をググると、AJAX を使用した "random server errors" や原因不明の AJAX 障害に不満を持つ人々が大勢見つかります。

IE は (他のほとんどのブラウザーと異なり) 常に 2 つの TCP/IP パケットとして HTTP POST を送信することがわかっています。ヘッダーとボディは別々に送信されます。失敗の直後のケースで IE はヘッダのみを送信します。 . IE はペイロードを送信することはなく、サーバーは最終的にタイムアウトで応答します。

そこで質問ですが、なぜこのような動作になるのでしょうか?HTTP 仕様に基づくと間違っているように思えますし、他のブラウザーはこのように動作しません。単にバグなのでしょうか? 確かに、これはどんな深刻なAJAXベースのWebアプリケーションでも大混乱を引き起こします。

参考情報です。

HTTP keep-alive のタイムアウトが 1 分より短い場合に発生する同様の問題があり、ここに文書化されています。

http://us.generation-nt.com/xmlhttprequest-post-sometimes-fails-when-server-using-keep-aliv-help-188813541.html

http://support.microsoft.com/default.aspx?kbid=831167

どのように解決するのですか?

この質問に対する明確な答えはないようなので、私の経験則に基づくデータを代用して、それを回避する方法をいくつか提示します。もしかしたら、いつか MS の内部関係者がこの問題に光を当ててくれるかもしれません...。

  1. もし HTTP Keep-Alive が 無効 に設定されている場合、この問題は解消されます。言い換えれば、HTTP 1.1 サーバはすべての Ajax リクエストに対して Connection: Close 行で応答します。これにより IE は満足しますが、すべての Ajax リクエストで新しい接続が開かれることになります。これは、特に高遅延ネットワークにおいて、パフォーマンスに大きな影響を与える可能性があります。

  2. Ajax リクエストが連続して行われた場合、この問題は簡単に引き起こされます。たとえば、100 ミリ秒ごとに Ajax リクエストを行い、その後ネットワークの状態が変化すると、エラーは簡単に再現されます。ほとんどのアプリケーションでは、このようなリクエストはしないでしょうが、この問題につながるようなサーバー呼び出しが、直後に何度も起こる可能性は十分にあります。おしゃべりが少なければ、IE も満足です。

  3. NTLM 認証がなくても発生します。

  4. サーバー上の HTTP keep-alive タイムアウトがデフォルト (Windows のデフォルトは 60 秒) よりも短い場合に発生します。詳細は問題のリンクに記載されています。

  5. Chrome や Firefox では起こりません。FF は 1 つのパケットを送信するので、この問題を完全に回避しているようです。

  6. IE 6、7、8 で発生します。IE 9 ベータでは再現できませんでした。