26

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

默认.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"            |**************************************|

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

4

1 回答 1

23

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

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

<%@ Page EnableSessionState="false" %>

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

设置EnableSessionState="ReadOnly"将防止该页面获得对 SessionState 的独占锁定(但页面本身必须等待用户的其他非只读请求完成才能加载)。

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

于 2010-11-30T22:10:01.640 回答