【问题标题】:ASP.net session request queuingASP.net 会话请求队列
【发布时间】:2011-05-18 03:58:49
【问题描述】:

在我看来,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"            |**************************************|

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

【问题讨论】:

  • 你如何测试这个? Visual Studio 中的 IIS 或 Cassini 开发服务器?
  • Windows Server 2008、7 Professional 和 VS 2010 Dev Server 上的 IIS。
  • 很好的问题,我以前从未想过这个问题。

标签: asp.net session blocking queuing


【解决方案1】:

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

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

<%@ Page EnableSessionState="false" %>

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

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

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

【讨论】:

  • 感谢您的链接。微软的设计决策似乎很糟糕,因为显式锁定甚至锁定集合中的项目将消除这个奇怪的限制。从我的一些阅读来看,这种设计似乎是会话数据驻留在 STAThread COM 对象中时的保留。
  • @Novikov:问题是会话在开始时加载并在每个页面请求结束时保存。因此,它基本上是易变的,并且在循环期间被多个页面访问是不安全的。想象一下,如果 Hang.aspx 更改了 Test.aspx 所依赖的关键会话值?在这个用例中,应用程序基本上会被搞砸。这不是 COM 特定的,而是那些无法解决的问题之一。
  • +1 - 我从来没有读过 MS 文档的最后一段。
  • @kev 他们绝对应该把它放在第一段!我花了 10 年的时间来了解这个功能。直到在 Fiddler 中发生那些迫使您深入研究的奇怪事情(错误)之前,您甚至都没有注意到它
  • 有没有办法在共享点后面托管的 WCF 服务中使用类似于 EnableSessionState 的东西?
猜你喜欢
  • 2020-05-13
  • 2016-02-09
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多