1. ホーム
  2. javascript

同じASP.NET MVCのアクションに複数のAJAXを同時に呼び出すと、なぜブラウザがブロックされるのでしょうか?

2023-12-30 21:25:34

質問

数日前、私はこんな質問をしました。

なぜ$.getJSON()はブラウザをブロックするのですか?

私は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 セッション状態の概要 :

ASP.NET セッション状態へのアクセスはセッションごとに排他的です。つまり、2 人の異なるユーザーが同時にリクエストした場合、個別のセッションへのアクセスは同時に許可されます。しかし の場合、最初のリクエストはセッション情報への排他的アクセスを得ます。2番目のリクエストは1番目のリクエストが終了した後にのみ実行されます。

困ったことに、私は数週間前にこの段落を読み飛ばしてしまい、太字の文のインパクトを完全に受け止められませんでした。私はそれを単に次のように読んでいました。 セッション状態へのアクセスはシリアライズされます。 と読み、そうではなく "セッション状態に触れるかどうかにかかわらず、すべてのリクエストはシリアライズされます" というのは、同じセッションからのリクエストの場合です。

幸いなことに、ASP.NET MVC3には回避策があり、セッションレスのコントローラを作成することが可能です。Scott Guthrie はここでこれらについて話しています。

ASP.NET MVC 3 (リリース候補 2) のアナウンスメント

MVC3 RC2をインストールし、プロジェクトをアップグレードしました。問題のコントローラを装飾して [SessionState(SessionStateBehavior.Disabled)] は問題を解決します。

そしてもちろん、典型的には、数分前にStack Overflowでこれを見つけたばかりです。

ASP.NET MVC で jQuery を使用して非同期コントローラーがリクエストをブロックしています。