web-dev-qa-db-ja.com

Internet Explorerが失敗後、Ajax呼び出しでHTTP投稿本文を送信しないのはなぜですか?

次のシナリオを確実に再作成できます。

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

ネットワーク接続に失敗した後、IEは次のAJAX要求を行いますが、HTTPヘッダーのみを送信します(本文ではなく)HTTP投稿を行うとき。これは部分的なリクエストにすぎないため、サーバー上であらゆる種類の問題を引き起こします。Bingでこの問題をGoogleで検索すると、「ランダムサーバーAJAXまたは説明のないAJAXエラー。

IE(他のほとんどのブラウザとは異なり)は常にH​​TTP POST= 2つのTCP/IPパケットとして送信します。ヘッダーと本文は別々に送信されます。障害の直後の場合、IEはヘッダーのみを送信します

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

参照情報:

1分より短いHTTPキープアライブタイムアウトによってトリガーされる同様の問題があり、ここに記載されています。

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

障害のパケットキャプチャの前後を次に示します。

HTTPヘッダーとペイロードの送信方法に注意してください http://img827.imageshack.us/i/beforee.png/

失敗後、ヘッダーのみが送信されることに注意してください。 IEneverはペイロードを送信し、サーバーは最終的にタイムアウトで応答します。 http://img203.imageshack.us/i /retryt.png/

113
Dodgyrabbit

この質問に対する明確な答えはないようですので、経験データを代用として提供し、それを回避するいくつかの方法を提供します。おそらく、一部のMSインサイダーは、いつかこれに光を当てるでしょう...

  1. サーバーでHTTPキープアライブが無効の場合、この問題はなくなります。つまり、HTTP 1.1サーバーはすべてのAjaxリクエストにConnection: Close応答の行。これはIE幸せを保ちますが、すべてのAjaxリクエストが新しい接続を開くようにします。これは、特に高遅延ネットワークでパフォーマンスに大きな影響を与える可能性があります。

  2. この問題は、Ajaxリクエストが連続して行われた場合に簡単に引き起こされます。たとえば、Ajaxリクエストを100ミリ秒ごとに行い、その後ネットワークステータスが変化すると、エラーを簡単に再現できます。ほとんどのアプリケーションはおそらくそのような要求を行いませんが、この問題につながる可能性のあるサーバーコールが次々に発生する可能性があります。おしゃべりが少ないIE幸せ。

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

  4. サーバーでのHTTPキープアライブタイムアウトがデフォルト(Windowsではデフォルトで60秒)より短い場合に発生します。問題のリンクで提供される詳細。

  5. ChromeまたはFirefoxでは発生しません。FFは1パケットを送信するため、この問題を完全に回避できるようです。

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

27
Dodgyrabbit

というタイトルのMicrosoft KB記事 Microsoft Internet Explorerまたは別のプログラムを使用して再POST操作を実行すると、ヘッダーデータのみが投稿されますが修正されているようですこの問題。

この記事では、修正プログラムを提供しています。 IE8などの最新のブラウザーでは、修正プログラムは既に含まれていますが、クライアントPCのレジストリ設定で有効にする必要があります

11
Julian

いくつかの古いバージョンのIEがPOSTの本文ではなくヘッダーのみを送り返すという同様の問題がありました。私の問題は、IEとNTLMに関連していることが判明しました。 NTLMについては言及しなかったため、これはおそらく役に立ちませんが、念のためです:

http://support.Microsoft.com/kb/251404

2
reassembler

これはロングショットですが、IE(そしてFirefoxでさえ)は、HTTPリクエストに使用する接続を「記憶」している場合があります。注/例:

  • Firefoxで、プロキシ設定を変更し、ページでSHIFT-RELOADを押すと、古いプロキシが引き続き使用されます。ただし、古いプロキシ(「killall squid」)を強制終了すると、新しいプロキシの使用が開始されます。

  • 切断/再接続すると、新しいIPアドレスまたは同様のものを受け取りますか?どういうわけか古いIPアドレスを監視して、IEがそのデッドアドレスにデータを送信しているかどうかを確認できますか?

  • 私の推測ではIEは間違ったパスをたどってデータを送信しています。「POST」パケットのネットワーク接続をキャッシュしないほど賢いかもしれませんが、そうするほど賢くないかもしれません。 for POSTペイロード。

  • これはおそらく、ほとんどのAJAXアプリに影響しません。なぜなら、人々はめったにネットワークの切断と再接続を行わないのですか?

1
barrycarter

NTLM認証を使用していますか?

NTLM認証を使用する場合、IEはポストデータを送信しません。ヘッダー情報を送信し、不正な応答が承認を送信することを期待し、「再認証」後にポストを送信します。

1
The-MeLLeR