2009-03-05 3 views
8

Webアプリケーションがあり、ajaxを使用してWebサーバーにコールしてデータを取得します。同期xmlhttprequestを呼び出すときにIEが5分間停止する

時々(という予測不可能な瞬間に、それを再現することができます)IEは道Iを5分間完全にハングアップ(ウィンドウが応答していないと言う)、その後、戻ってくると、XMLHttpRequestオブジェクトがエラー12002.

で応答以下の通りです。ボタンがウィンドウB. PROC1がファイルを実行開くためにクリックされたとき

  1. 開くメインウィンドウからウィンドウ(B)(A)を使用してボタン
  2. ウィンドウAは同期AJAX(PROC1)を呼び出します。
  3. 新しいウィンドウ(B)にはajaxコード(PROC2)があり、サーバー非同期を呼び出します。
  4. PROC2の完了後、データが返される前にユーザーがウィンドウBを閉じます。
  5. メインウィンドウ(a)で、ユーザーがもう一度ボタンをクリックします。 PROC1は再び実行されますが、send()コールは5分間ブロックされます。

助けてください。私は3日間探しています。

ご注意: は*私はそれはアプリが構築される方法です(同期呼び出しを使用するを持っている* (アプリはFirefoxの互換性はありません)Firefoxでそれをテストすることはできません、それはあまりにも多くの開発者を取ります

なぜこれが起こり、これを修正するのですか?

+0

だけの提案プロセスエクスプローラとプロセスモニタを使用して何が起こっているのかを知るフード '? – Terry

答えて

1

Winsockエラー12002は、次のmsdn

ERROR_INTERNET_TIMEOUT 

12002 

The request has timed out. 

に係るWinsockのは非常にHTTPエラー範囲(300400500など)ではないthatsのエラーは、ほとんどのWinsockであるIEでXMLHTTPのための基礎となるソケット転送オブジェクトであることを意味しますエラー。

あなたの質問から明らかでなかったことは、同じリソースが2回目のラウンドで照会されていることです。

'?uid=+'Math.random() 

問題を解決する可能性のあるURLに新しいキャッシュされていないリソースを追加することができます。

別の解決策は、ウィンドウオブジェクトの "onbeforeunload"イベントに関数をアタッチして、ウィンドウBが閉じられる直前にアクティブなXMLHTTP要求をabort()することです。

これらの2つのポインタがあなたのバグを解決することを願っています。

2

Martijnにお返事ありがとうございます。

それは私の問題を解決しませんでした。私は、私は最高のこのウェブサイト上で説明されて見ているものを考える:私の状況でhttp://bytes.com/groups/javascript/643080-ajax-crashes-ie-close-window

は、私が不安定な接続または低速なWebサーバとを持っている接続が遅すぎると、ブラウザとウェブサーバは、まだその接続を持っている場合凍る。

7

あなたは正しいと思います。これはInternet Explorerの接続制限2に関連しています。何らかの理由で、IEは閉じられたウィンドウで実行されるAJAX要求への接続を解放しません。

私は少しだけシンプルな、非常に似たような状況があります:ウィンドウAで

  • ユーザーがクリックするウィンドウBを開くために
  • ウィンドウBは、Ajaxの呼び出しが戻る前にしばらくの間
  • をとるAjax呼び出しを行い、ユーザはウィンドウBを閉じます。このコールへの接続は「リークします」。
  • 繰り返し1より多くの時間の両方使用可能な接続が
  • を「漏れた」されるまで、ブラウザが動作するようには思えないあなたが試すことができます応答しなく

一つの技術は、(あなたが見つかった資料に記載)XMLHTTPを中止することですとなりページのアンロードイベントでのリクエスト。

だから、のようなもの:

var xhr = null; 

function unloadPage() { 
    if(xhr !== null) { 
    xhr.abort(); 
    } 
} 

別のオプションは、基本的にブラウザをロックする、呼び出しが返されるまでブロックします同期AJAX呼び出しを、使用することです。これはあなたの特定の状況を考えれば受け入れられるかもしれません。

// the 3rd param is whether the call is asynchronous 
xhr.open('get', 'url', false); 

最後に、別のところで説明したように、IEがレジストリで使用する接続の最大数を調整できます。しかし、これを行うには、あなたのサイトへの訪問者を期待することは現実的ではない、それは実際に問題を解決することはできません - ちょうど起きてからそれを遅らせます。副作用として、IE8は6つの同時接続を許可します。デフォルトのInternet Explorerで

+0

IE8でajaxと開閉ウィンドウを使用して非常によく似た問題を解決するために、中止ソリューションを使用しました。しかし、中止し、私が探していた応答を失うことがないようにするには、async:jQueryでfalseを使用する必要がありました。これは私の場合は問題ありませんでしたが、明らかに理想的ではありません。しかし、中止は空の新しいウィンドウの問題を解決しました。もう少し詳しくは、http://stackoverflow.com/questions/446594/kill-ajax-requests-using-javascript-using-jqueryのコメントを参照してください。 –

2

はダウンロードのみの目的のために同じウェブサイトに2つの同時接続を許可します。あなたがこれ以上試してみると、I.E.前の要求の1つが終了して次の要求が完了するまで停止する。私は(私が間違っている可能性が)、これは一度に多数の同時ダウンロードと過負荷にウェブサイトを防ぐために、所定の位置に置かれたと信じています。このロックを迂回するレジストリハックがあります。

私はこれらの命令は私の問題を緩和し、インターネットを中心に蹴った - あなたが直面している私はそれがあなたの状況のた​​めに働くことを約束することはできませんが、複数接続制限は、関連する表示されます:

  1. [スタート]ボタンをクリックし、[実行]を選択します。実行ラインタイプRegedt32.exeをオン
  2. とEnterキーを押します。これは
  3. レジストリエディタを起動次のレジストリキーを見つけます:インターネット設定キー上 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
  4. クリックします。
  5. 今NEW
  6. にポイント、[編集]メニューに移動
  7. DWORD値]をクリックします
  8. タイプMaxConnectionsPer1_0ServerこのDWORD値の名前。
  9. 先ほど作成し、以下の情報を入力しMaxConnectionsPer1_0Serverキーをダブルクリックし、値のデータ:10.ベース:10進数。
  10. プレスOKを終えました。
  11. 繰り返し9を介してこの時間キーMaxConnectionsPerServerを命名し、レジストリエディタを閉じ
  12. OKを押して終了したら、ステップ8
  13. に示されているように、同じ値を割り当てるを4ステップ。

もちろん、前述のabort()呼び出しと組み合わせて使用​​します。それと同時に、彼らは問題を解決すべきです。

2

IE5とIE6は、実際にはPHPスクリプトからデータを受け取ろうとするとハングします。その理由は、これらのブラウザでは、すべてのデータがいつ受信されたかを判断できず、接続を閉じることができないからです。したがって、接続が切れるまで待ちます(したがって、5分または10分のハング)。これを解決する方法は、ブラウザにどのくらいのデータを受け取るかを伝えることです。 PHPでは、次のように出力バッファリングを使用してこれを行うことができます。

ob_start(); 
echo $html_content; 
header('Connection: close'); 
header('Content-Length: '.ob_get_length()); 
flush(); 
ob_end_flush(); 

これは、通常のWebページをロードするときの解決策です。一つは AJAXを使用している場合はMicrosoft.XMLHTTPがそれをオブジェクト経由でGET に十分である「接続:閉じる」を送信

r.request.open("GET", url, true); 
r.request.setRequestHeader("Connection", "close"); 
r.request.send(); 
0

のように、すべてのこれらの投稿GETリクエストとヘッダを - 無効にPDFリーダー..とその原料を...あなたの問題... が解決しないだろう。しかし確かショットがある - RUN WINDOWSのUPDATE .. 経験を話す..この問題を単独で解決さ.. uptodate保つ;)

HydTechie

関連する問題