2010-11-30 23 views
23

ASP.netは同じセッションIDを使用するすべての要求をキューに入れているようです。 3ページあるとします。ASP.netセッション要求キュー

Default.aspxの

protected void Page_Load(object sender, EventArgs e) 
{ 
    Session["asdf"] = "LOLZ"; 
} 

が存在しない場合は、明らかに新しいセッションを作成し、このページを叩きます。その後

X-AspNet-Version: 2.0.50727 
Set-Cookie: ASP.NET_SessionId=ibjphuv0aiafqi453tyze345; path=/; HttpOnly 

あなたはHang.aspx

protected void Page_Load(object sender, EventArgs e) 
{ 
    Thread.Sleep(10000); 
} 

そして、あなたは、このセッションIDは、それが何をしている場合、重要ではありませんに渡されることを他のページにヒットした直後、のテストにそれを呼びましょうヒット.aspx。

ローディングのシーケンスはそうです。

Request   Timeline 
"GET /"   |*| 
"GET /Hang.aspx"  |******************************************| 
"GET /Test.aspx"   |**************************************| 

私はこの機能を無効にする方法です。私は、セッション状態をより予測可能にすることが有益であると理解していますが、私の場合、長時間実行されているレポートページの負荷がユーザのマルチタスク能力を奪うことになります。

+0

どのようにこれをテストしていますか? Visual StudioでIISまたはCassini開発サーバーですか? – Kev

+0

Windows Server 2008、7 Professional、およびVS 2010 Dev Server上のIIS。 – Novikov

+2

優秀な質問ですが、私は以前これについて考えたことはありませんでした。 – Kev

答えて

19

この動作は仕様です。セッション状態への同時アクセスは許可されません。同じSessionIDを持つ要求は、その状態の潜在的な破損を防ぐために排他的にロックされます。

これを回避するには、ページのディレクティブでセッションの状態を無効にすることができます。

<%@ Page EnableSessionState="false" %> 

「コンカレントリクエストとセッション状態」はこちらhttp://msdn.microsoft.com/en-us/library/ms178581.aspxをご覧ください。

設定すると、そのページがSessionStateに対して排他ロックを取得できなくなります(ただし、ページ自体は、読み込み前に完了していない他のReadOnly要求を待機する必要があります)。

(これは、この質問ASP.net site: Long-loading page for user puts all other page loads for user on Holdへの私の答えのコピー&ペーストである)

+1

リンクありがとうございました。明示的なロックやコレクション内のアイテムのロックさえもこの奇妙な制限を取り除くため、マイクロソフトの設計上の意思決定が悪いようです。私の読書のいくつかから、このデザインはセッションデータがSTAThread COMオブジェクトに常駐していた時のホールドオーバーであるようです。 – Novikov

+3

@Novikov:問題は、セッションが最初に読み込まれ、すべてのページリクエストの最後に保存されることです。このため、基本的には揮発性であり、サイクル中に複数のページからアクセスすることは安全ではありません。 Hang.aspxがTest.aspxが依存するキーセッションの値を変更した場合を想像してみてください。このユースケースでは、アプリは基本的にはネジ止めされています。これはCOM固有のものではなく、解決できない問題の1つです。 – NotMe

+1

+1 - MSのドキュメントの最後の段落までは読んだことがありません。 – Kev