Internet Explorer を使用してアプリケーションを実行しているユーザーが断続的に失敗する問題は、Internet Explorer のバグが原因であることを最近発見しました。このバグは HTTP スタックにあり、IE からの POST リクエストを使用するすべてのアプリケーションに影響するはずです。その結果、要求が約 5 分間 (サーバーの種類と構成によって異なります) ハングしたように見え、その後サーバー側で失敗するという障害が発生します。サーバーがあきらめた後、ブラウザ アプリケーションはポスト リクエストからエラーになります。以下、IEのバグについて詳しく説明します。
私が知る限り、XMLHttpRequest を使用して POST リクエストをサーバーに送信するすべてのアプリケーションで、リクエストが間違ったタイミングで送信された場合に、これが発生します。私はちょうどその時に POSTS を送信しようとするサンプル プログラムを書きました。サーバーが接続を閉じた正確な瞬間に、継続的な POST をサーバーに送信しようとします。間隔は、サーバーから送信された Keep-Alive ヘッダーから取得されます。
IE からサーバーに少し遅延がある場合 (つまり、同じ LAN 上にない場合)、数回の POST の後に問題が発生することがわかりました。それが起こると、IE は非常に激しくロックアップするため、強制終了する必要があります。時を刻む時計は、ブラウザがまだ応答していることを示しています。
http://pubdev.hitech.com/test.post.phpを参照して試すことができます。IE をクラッシュさせる可能性があるため、IE セッションを実行するときに重要な未保存の情報がないように注意してください。
完全なソースはhttp://pubdev.hitech.com/test.post.php.txtで取得できます。PHP があり、永続的な接続用に構成されている任意のサーバーで実行できます。
私の質問は次のとおりです。
この問題に関する他の人々の経験は何ですか?
この問題を回避するための既知の戦略はありますか (「別のブラウザーを使用する」以外に)?
Microsoft は、この問題について、私が見つけた記事 (以下を参照) よりも詳しい情報を提供していますか?
問題は、RFC 2616 セクション 8.1 で説明されているように、Web ブラウザーとサーバーがデフォルトで永続的な接続を使用することです ( http://www.ietf.org/rfc/rfc2616.txtを参照)。)。これは、特に AJAX アプリケーションのパフォーマンスにとって非常に重要であり、無効にしないでください。ただし、サーバーが接続がアイドル状態であると判断し、接続を閉じることを決定すると同時に、ブラウザーが以前に使用された接続で POST の送信を開始する可能性がある小さなタイミング ホールがあります。その結果、ブラウザの HTTP スタックは閉じたソケットを使用しているため、ソケット エラーが発生します。RFC 2616 セクション 8.1.4 は、この状況を予測しており、「...クライアント、サーバー、およびプロキシは、非同期クローズ イベントから回復できなければなりません。クライアント ソフトウェアは、トランスポート接続を再開し、中断された一連の要求をユーザーの操作なしに再送信する必要があります」と述べています。 ...」
これが発生した場合、Internet ExplorerはPOST を再送信しますが、再送信すると要求が壊れます。投稿されたデータの Content-Length を含む POST ヘッダーを送信しますが、データは送信しません。これは不適切なリクエストであり、サーバーは約束されたデータを不特定の時間待機してから、エラーでリクエストを失敗させます。HTTP サーバーをシミュレートする C プログラムを使用して、この失敗を 100% 実証することができました。これは、応答を送信せずに受信 POST 要求のソケットを閉じます。
Microsoft はhttp://support.microsoft.com/kb/895954でこの失敗を認めているよう です。彼らは、それが IE バージョン 6 から 9 に影響を与えると言います。これは、IE 7 以降のすべてのバージョンの IE に同梱されている、この問題に対するホットフィックスを提供します。ホットフィックスは、次の理由で満足できるものではないようです:
regedit を使用して FEATURE_SKIP_POST_RETRY_ON_INTERNETWRITEFILE_KB895954 というキーをレジストリに追加しない限り、有効になりません。これは、ユーザーがしなければならないことではありません。
ホットフィックスは、破損した POST を実際には修正しません。代わりに、ソケットが RFC の予想どおりに閉じられた場合、POST を再送信しようとせずに、すぐにエラーになります。アプリケーションはまだ失敗します。失敗するのが早いだけです。
次の例は、バグを示す自己完結型の php プログラムです。サーバーが接続を閉じた正確な瞬間に、継続的な POST をサーバーに送信しようとします。間隔は、サーバーから送信された Keep-Alive ヘッダーから取得されます。