2010-11-30 94 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 2010-11-30 21:43:14

+0

Windows Server 2008,7 Professional和IIS 2010 Dev Server上的IIS。 – Novikov 2010-11-30 21:43:57

回答

19

此行为是设计使然;不允许并发访问会话状态。具有相同SessionID的请求将被专门锁定以防止其状态的潜在损坏。

要解决这个问题,您可以在页面指令中禁用会话状态。

<%@ Page EnableSessionState="false" %> 

阅读“并发请求和会话状态”这里http://msdn.microsoft.com/en-us/library/ms178581.aspx更多。

设置EnableSessionState="ReadOnly"将阻止该页面获得对SessionState的排他锁定(但页面本身必须等待用户的其他非ReadOnly请求在加载前完成)。

(这是我回答的复制和粘贴到这个问题ASP.net site: Long-loading page for user puts all other page loads for user on Hold