ASP.net会话请求排队

Nov*_*kov 26 asp.net session queuing blocking

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

Default.aspx的

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

如果不存在,点击此页面显然会创建一个新会话.

X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=ibjphuv0aiafqi453tyze345; path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)

然后你点击Hang.aspx

protected void Page_Load(object sender, EventArgs e)
{
    Thread.Sleep(10000);
}
Run Code Online (Sandbox Code Playgroud)

在你点击任何其他页面后会立即传递此会话ID,无论它是否有任何作用,我们称之为Test.aspx.

加载的顺序是这样的.

Request            Timeline
"GET /"            |*|
"GET /Hang.aspx"       |******************************************|
"GET /Test.aspx"            |**************************************|
Run Code Online (Sandbox Code Playgroud)

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

dan*_*shr 21

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

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

<%@ Page EnableSessionState="false" %>
Run Code Online (Sandbox Code Playgroud)

请阅读http://msdn.microsoft.com/en-us/library/ms178581.aspx中的 "并发请求和会话状态" 以获取更多信息.

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

(这是我对ASP.net网站问题的回答的复制和粘贴:用户的长加载页面将用户的所有其他页面加载置于保持状态)

  • @Novikov:问题是会话在开头加载并在每个页面请求结束时保存.因此,它基本上是易失性的,并且在循环期间被多个页面访问是不安全的.想象一下,如果Hang.aspx改变了Test.aspx所依赖的关键会话值?在这个用例中,应用程序基本上是拧紧的.这不是COM特定的,而是那些无法解决的问题之一. (3认同)
  • @kev他们绝对应该把它放在第一段!我花了10年的时间来了解这个功能.从来没有注意到它,直到Fiddler发生的那些奇怪的事情(错误)迫使你深入研究 (2认同)