仕様は次のとおりです。
- ASP.NET AJAX を使用する ASP.NET 3.5
- AJAX コントロール ツールキット
- jQuery1.3.2
- ウェブサービス
- Windows Server 2003 SP1 上の IIS6
- SP1 SQLServer 2005 SP3 サイトは SSL です
- Infragistics Web Components 2009 Vol. 2 (Aikido 以外のコントロールを使用)、UltraWebGrid および Tree コントロールが主に使用されます。
問題は次のとおりです。IE 7/8 でホワイト スクリーン オブ デス (WSOD) が表示されます。基本的に、各アコーディオン ペインのコンテンツが Infragistics Tree Control である AJAXControl Toolkit アコーディオン コントロールを持つ左ペインを持つページがあります。右側のペインには、左側のメニュー ペインでクリックされた内容に基づいてコンテンツがリロードされる があります<div>
。<iframe>
では<iframe>
、左ペインのメニュー項目をクリックすると、1 つまたは複数の UltraWebGrid コントロールを含むページがロードされます。すべてのグリッドには、テンプレート化されたボタン列があります。グリッド行の編集ボタンをクリックすると、レコードを編集するためのポップアップ ウィンドウが開きます。これは約 10 回は正常に機能し、10 回目 (場合によってはそれより前) にポップアップ ウィンドウが開き、アドレス バーに正しい URL が表示されますが、ページは読み込まれません。
1 つのポップアップ ウィンドウを使用してレコードを更新するアプリケーションがあります。ほとんどの場合、[編集] ボタンをクリックしてレコードを編集すると、ポップアップ ウィンドウが開き、更新ページが読み込まれます。ただし、レコードをしばらく編集した後、突然ポップアップ ウィンドウが開きますが、空白のままでハングします。URLはアドレスバーにあります。
Fiddler をロードすると、更新ページの要求が送信されないことに気付きました。これは、クライアント側での何らかのロックアップであると思われます。ポップアップ ウィンドウにある同じ URL を新しいブラウザ ウィンドウにコピーすると、通常、ページは正常に読み込まれます。
観察事項: - リクエストがサーバーに送信されることはないため、クライアント側またはブラウザに関連するものであることは間違いありません。- サイトにトラフィックの類似性がある場合にのみ発生するように見えますが、これは奇妙なことです。これはクライアント側のコードに含まれているように見えるためです - バックグラウンドで数秒ごとに呼び出されている Web サービスがあり、ユーザーがログオンしているかどうかをチェックしています、しかし、これはフリーズを引き起こしません。
私はここで本当に途方に暮れています。私は WSOD をググりましたが、私の特定の WSOD に関連するものはあまりないようです。何か案は?
何が問題なのか
そのため、メモリ リーク (クライアント側で一部を封印しましたが) は問題ではないことがわかりました。問題は、クライアント側で Web サービス呼び出しが行われていることです。(別のウィンドウと同期するために) ユーザーが 4 秒ごとにログオンしているかどうかを確認するものがあります。次に、ポップアップ ウィンドウとグリッド状態のユーザー設定を取得するための Web サービス呼び出しがあります。私が読んだことから、Web サービスは非同期でなければなりません。成功/失敗のコールバックを使用して JavaScript から呼び出すことで、非同期であると想定しましたが、実際にはそうではありません。クライアント側/ブラウザーの観点からは非同期ですが、サーバー側からは、Web サービスへの呼び出しが行われ、接続数が限られているため、他の操作を保留して完了すると返されます。
では、Web サービス メソッドを非同期にする最も簡単な方法は何でしょうか? Web サービスを WCF Web サービスに変換する必要がありますか? それとも、既存の ASP.NET Web サービス呼び出しを使用できますか?
そして、歴史的な目的のために、ここに私が最初に問題があったと思ったものがあります:
これをローカルまたはテスト サーバーで再現することはできませんでした。しかし、Fiddler を使用してモデムの速度をシミュレートすると、突然、ローカル PC で WSOD を複製できるようになりました。そのため、少なくとも私のテスト環境では、ポップアップウィンドウを開くと、接続が遅くなったり一時的に遅くなったりして、チョークが発生するように見えます.
アドオンなしで IE を実行して別のテストをiexplore.exe -extoff
行いましたが、結果は同じでした。また、iframe の URL が変更されるたびにページ上の iframe が再作成される問題も修正しました。私の論理の一部が省略されました。これで、iframe は 1 回だけ作成されます。その後、src
新しいコンテンツをロードしたいときに属性のみが更新されます...私の間抜け。JavaScript クロージャーでいくつかのウィンドウ参照が残っていることに気付きました。そのため、それらを使い終わったときに、クロージャーでそれらが明示的に null に設定されるようになりました。
また、メモリ リークの調査もいくつか行いました。 /library/wa-memleak/?S_TACT=105AGX52&S_CMP=cn-a-wa
Crockenator の IE メモリ リークのパージ コードを追加しました ( http://www.crockford.com/javascript/memory/leak.htmlを参照)。
$(document).ready(function() { function purge(d) { var a = d.attributes, i, l, n;
if (a) { l = a.length; for (i = 0; i < l; i += 1) { if (a[i]) { n = a[i].name; if (typeof d[n] === 'function') { d[n] = null; purgeCount++; } } } } a = d.childNodes; if (a) { l = a.length; for (i = 0; i < l; i += 1) { purge(d.childNodes[i]); } } } $(window).unload(function() { purge(document.body); //alert("purge count: " + purgeCount); });
});
私の改善のどれも問題を解決していません。私のローカルテストシナリオで。何か案は?誰?誰?ビューラー?
最後の更新
セッション状態が Web サービスの問題の原因であることを指摘してくれた David に感謝します。「ASP.NET はすべての要求を同じ「セッション」にキューに入れます。そのため、最初の要求が長時間ブロックされると、他のキューに入れられた要求が保留になります。」
そのため、セッション状態を使用して Web サービスを最小限に抑えることを試みましたが、Microsoft が推奨する接続数の設定も追加しました。http://msdn.microsoft.com/en-us/library/ff647786.aspxを参照してください。 #scalenetchapt10_topic9