ASP.net会话请求队列

ASP.net会话请求队列,asp.net,session,blocking,queuing,Asp.net,Session,Blocking,Queuing,在我看来,ASP.net将所有使用相同会话ID的请求排队。假设您有3个页面 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

在我看来,ASP.net将所有使用相同会话ID的请求排队。假设您有3个页面

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将被传递到的任何其他页面之后,不管它是否做了什么,让我们将其称为Test.aspx

装载的顺序是这样的

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

我想我的问题是如何禁用此功能。我知道这样做很有用,因此会话状态可以更可预测,但是在我的情况下,长时间运行的报告页面加载正在扼杀用户的多任务能力。

这种行为是出于设计;不允许同时访问会话状态。具有相同SessionID的请求将被锁定,以防止其状态可能被破坏

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

<%@ Page EnableSessionState="false" %>

有关更多信息,请阅读此处的“并发请求和会话状态”

设置
EnableSessionState=“ReadOnly”
将阻止该页面获得SessionState上的独占锁(但页面本身必须等待用户的其他非只读请求在加载之前完成)


(这是我对这个问题答案的复制和粘贴)

你是如何测试的?Visual Studio中的IIS或Cassini开发服务器?Windows server 2008、7 Professional和VS 2010开发服务器上的IIS。问得好,我以前从未想过这个问题。感谢您提供的链接。对于微软来说,这似乎是一个糟糕的设计决策,因为在集合中显式锁定甚至锁定项目都会消除这种奇怪的限制。从我的一些阅读资料来看,这种设计似乎是会话数据驻留在StatThread COM对象中时的遗留问题。@Novikov:问题是会话在每个页面请求的开始加载,并在结束时保存。因此,它基本上是不稳定的,并且在循环期间被多个页面访问是不安全的。想象一下,如果Hang.aspx更改了Test.aspx所依赖的密钥会话值?在这个用例中,应用程序基本上是螺旋式的。这不是COM特有的,而是一个无法解决的问题。+1-我从来没有读过MS文档中的最后一段。@kev他们肯定应该把它放在第一段!我花了10年的大部分时间才找到这个功能。直到Fiddler中发生了那些让你不得不深入研究的可怕的事情(bug)之前,我都没有注意到这一点。有没有办法在sharepoint背后托管的WCF服务中使用类似于EnableSessionState的东西?