ASP.net会话请求排队

时间:2010-11-30 21:40:20

标签: 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=/; 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"            |**************************************|

我想我的问题是如何禁用此功能。我知道让会话状态更可预测是有用的,但在我的情况下,长时间运行的报告页面加载会破坏用户执行多任务的能力。

1 个答案:

答案 0 :(得分:21)

这种行为是设计的;不允许并发访问会话状态。具有相同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