同じASP.NET MVCのアクションに複数のAJAXを同時に呼び出すと、なぜブラウザがブロックされるのでしょうか?
質問
数日前、私はこんな質問をしました。
私は6つのjQuery非同期ajaxリクエストを同じコントローラアクションでかなり一度に発射します。各リクエストは10秒かけて返されます。
アクションメソッドへのリクエストをデバッグしてログに記録することで、リクエストがシリアライズされ、決して並列で実行されないことに気づきました。
2010-12-13 13:25:06,633 [11164] INFO - Got:1156 2010-12-13 13:25:16,634 [11164] INFO - 返却:1156 2010-12-13 13:25:16,770 [7124] INFO - 取得:1426 2010-12-13 13:25:26,772 [7124] INFO - リターン:1426 2010-12-13 13:25:26,925 [11164] INFO - Got:1912 2010-12-13 13:25:36,926 [11164] INFO - リターン:1912 2010-12-13 13:25:37,096 [9812] INFO - Got:1913 2010-12-13 13:25:47,098 [9812] INFO - Returning:1913 2010-12-13 13:25:47,283 [7124] INFO - Got:2002 2010-12-13 13:25:57,285 [7124] INFO - リターン:2002 2010-12-13 13:25:57,424 [11164] INFO - Got:1308を取得しました。 2010-12-13 13:26:07,425 [11164] INFO - Returning:1308 です。
FireFoxでネットワークのタイムラインを見てみると、このようになっています。
上記のログサンプルと Firefox のネットワークタイムラインの両方が、同じリクエストのセットに対するものです。
同じページからの同じアクションへのリクエストはシリアライズされていますか?
同じページから同じアクションへのリクエストはシリアル化されますか?
へのアクセスがシリアライズされることは承知しています。
Session
オブジェクトへのシリアル化されたアクセスを認識していますが、セッションデータには触れていません。
私はクライアント側のコードを単一のリクエスト (最も長く実行されるもの) に縮小しましたが、これはまだブラウザをブロックします。つまり、ajaxリクエストが完了したときにのみ、ブラウザはリンクのクリックに応答します。
ここで (Chrome の開発者ツールで) 私が観察したことは、実行時間の長い ajax リクエストが実行されているときにリンクをクリックすると、ブラウザが
Failed to load resource
エラーを直ちに報告することです。これは、ブラウザが ajax リクエストを終了した (または終了して待機しようとしている?) ことを示唆しています。
しかし、ブラウザはまだ新しいページにリダイレクトするのに時間がかかります。
Ajaxリクエストは本当に非同期なのでしょうか、それともjavascriptが実際にはシングルスレッドであるため、このような手品になるのでしょうか?
私のリクエストは、これが機能するためには時間がかかりすぎるのでしょうか?
FirefoxやIEでも問題が発生します。
また、スクリプトを変更し
$.ajax
を直接使うようにし、明示的に
async: true
.
私はこれを IIS7.5 上で実行しています。Windows 2008R2 と Windows 7 の両方のフレーバーが同じことをします。
デバッグおよびリリース ビルドも同じ動作をします。
どのように解決するのですか?
答えは、私の目の前にありました。
<ブロッククオートASP.NET セッション状態へのアクセスはセッションごとに排他的です。つまり、2 人の異なるユーザーが同時にリクエストした場合、個別のセッションへのアクセスは同時に許可されます。しかし の場合、最初のリクエストはセッション情報への排他的アクセスを得ます。2番目のリクエストは1番目のリクエストが終了した後にのみ実行されます。
困ったことに、私は数週間前にこの段落を読み飛ばしてしまい、太字の文のインパクトを完全に受け止められませんでした。私はそれを単に次のように読んでいました。 セッション状態へのアクセスはシリアライズされます。 と読み、そうではなく "セッション状態に触れるかどうかにかかわらず、すべてのリクエストはシリアライズされます" というのは、同じセッションからのリクエストの場合です。
幸いなことに、ASP.NET MVC3には回避策があり、セッションレスのコントローラを作成することが可能です。Scott Guthrie はここでこれらについて話しています。
MVC3 RC2をインストールし、プロジェクトをアップグレードしました。問題のコントローラを装飾して
[SessionState(SessionStateBehavior.Disabled)]
は問題を解決します。
そしてもちろん、典型的には、数分前にStack Overflowでこれを見つけたばかりです。
関連
-
[解決済み】ASP.NET MVCビューで現在のアクションを返すにはどうすればいいですか?
-
[解決済み】Google Chromeでデバッグ時にスクリプトの実行を終了させる方法は?
-
[解決済み] [Solved] ASP.NET MVCでアクションの絶対URLを見つけるにはどうすればよいですか?
-
[解決済み】Chromeでのリクエストモニタリング
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ジェスト あるクラスの特定のメソッドをモックする方法
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] サブドメインにまたがってlocalStorageを使用する
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?