問題:
ASP.NET サイトでセッションを使用すると、複数の要求をほぼ同時にロードすると、劇的な遅延 (500 ミリ秒の倍数) が発生します。
より具体的には、私の問題
私たちのウェブサイトは、SessionId のみにセッションを使用します。このキーを使用して、ユーザー情報などを含む db テーブルを検索します。これは最小限のセッション データを格納するため、適切な設計のように思われました。残念ながら、セッションに何も保存しないと SessionId が変更されるため、Session["KeepId"] = 1;
. これは、SessionId が変更されないようにするのに十分です。
一見関係のないことですが、このサイトはコントローラー アクションを通じてカスタマイズされた製品画像を提供します。このアクションは、必要に応じて画像を生成し、キャッシュされた画像にリダイレクトします。これは、1 つの Web ページに画像やその他のリソースが含まれ、ASP.NET パイプラインを介して数十の要求が送信されることを意味します。
何らかの理由で、(a) 同時に複数のリクエストを送信し、(b) なんらかの方法でセッションが関与している場合、約 1/2 の時間でランダムな 500 ミリ秒の遅延が発生します。場合によっては、これらの遅延は 1000 ミリ秒以上になり、常に最大 500 ミリ秒の間隔で増加します。リクエストが多いほど、待ち時間が長くなります。数十の画像を含むページでは、画像によっては 10 秒以上待機することがあります。
問題の再現方法:
- 空の ASP.NET MVC Web アプリケーションを作成する
空のコントローラー アクションを作成します。
public class HomeController : Controller { public ActionResult Test() { return new EmptyResult(); } }
そのアクションにヒットするいくつかの img タグを含む test.html ページを作成します。
<img src="Home/Test?1" /> <img src="Home/Test?2" /> <img src="Home/Test?3" /> <img src="Home/Test?4" />
ページを実行して、firebug で高速な読み込み時間を確認します。
次のいずれかを実行します (どちらも同じ結果になります)。
空の Session_Start ハンドラーを Global.asax.cs に追加します。
public void Session_Start() { }
何かをセッションに入れる
public class HomeController : Controller { public ActionResult Test() { HttpContext.Current.Session["Test"] = 1; return new EmptyResult(); } }
ページを再度実行すると、応答がときどき/ランダムに遅延することに注意してください。
私がこれまでに知っていること
- MVC 2 & 3 および WebForms で発生します。
- どのブラウザでも発生します(FF、Chrome、IE、Safariを試しました)
- デバッガーが接続されているかどうかに関係なく発生します。また、実際にセッションに保存する必要はありません (上記の Session_Start の例を参照してください)。
- WebDev.exe、IIS Express、および IIS で発生します
私の質問
セッションを使用してこれらの遅延を回避するにはどうすればよいですか? 誰も修正を知っていますか?
修正がない場合は、セッションをバイパスして Cookie を直接使用する必要があると思います (セッションは Cookie を使用します)。