[解決済み] Internet ExplorerがAjax呼び出しに失敗した後、HTTPポストボディを送信しないのはなぜですか?
質問
以下のシナリオを確実に再現することができます。
- サーバーに AJAX リクエストを行う小さな HTML ページを作成します (HTTP POST を使用します)。
- ネットワークから切断し、再接続する
- 障害発生後に 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://support.microsoft.com/default.aspx?kbid=831167
どのように解決するのですか?
この質問に対する明確な答えはないようなので、私の経験則に基づくデータを代用して、それを回避する方法をいくつか提示します。もしかしたら、いつか MS の内部関係者がこの問題に光を当ててくれるかもしれません...。
-
もし HTTP Keep-Alive が 無効 に設定されている場合、この問題は解消されます。言い換えれば、HTTP 1.1 サーバはすべての Ajax リクエストに対して
Connection: Close
行で応答します。これにより IE は満足しますが、すべての Ajax リクエストで新しい接続が開かれることになります。これは、特に高遅延ネットワークにおいて、パフォーマンスに大きな影響を与える可能性があります。 -
Ajax リクエストが連続して行われた場合、この問題は簡単に引き起こされます。たとえば、100 ミリ秒ごとに Ajax リクエストを行い、その後ネットワークの状態が変化すると、エラーは簡単に再現されます。ほとんどのアプリケーションでは、このようなリクエストはしないでしょうが、この問題につながるようなサーバー呼び出しが、直後に何度も起こる可能性は十分にあります。おしゃべりが少なければ、IE も満足です。
-
NTLM 認証がなくても発生します。
-
サーバー上の HTTP keep-alive タイムアウトがデフォルト (Windows のデフォルトは 60 秒) よりも短い場合に発生します。詳細は問題のリンクに記載されています。
-
Chrome や Firefox では起こりません。FF は 1 つのパケットを送信するので、この問題を完全に回避しているようです。
-
IE 6、7、8 で発生します。IE 9 ベータでは再現できませんでした。
関連
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] jQuery Ajax呼び出し後のリダイレクトリクエストを管理する方法
-
[解決済み] Firefox または Chrome ブラウザから HTTP POST リクエストを手動で送信する方法
-
[解決済み] IEでデベロッパーツールを一度開いただけで、JavaScriptが動作するのはなぜですか?
-
[解決済み] CORSです。資格情報フラグが true の場合、Access-Control-Allow-Origin でワイルドカードを使用できない。
-
[解決済み] Internet ExplorerのIFRAMEでCookieがブロックされる/保存されない
-
[解決済み] FirefoxでjQuery $.ajax(), $.post がREQUEST_METHODとして "OPTIONS "を送信する問題
-
[解決済み】CORS(cross-origin resource sharing)投稿リクエストを動作させる方法
-
[解決済み] JSのDateからDay名
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSのDateからDay名
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] JSXとLoadshを使用して、ある要素をn回繰り返す方法
-
[解決済み] サブドメインにまたがってlocalStorageを使用する
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] これは純関数ですか?