在使用ASP.NET会话时是否可以强制请求并发?

时间:2010-09-13 16:53:13

标签: asp.net session concurrency

ASP.NET不允许同一会话的并发请求;这意味着用户一次只能发出1个请求。

例如,假设我们有Test1.aspx

  public partial class Test1 : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      Session["test"] = 1;
      System.Threading.Thread.Sleep(int.Parse(Request.QueryString["timeout"]));
    }
  }

...和Test2.aspx

  public partial class Test2 : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      Session["test"] = 1;
      Label1.Text = DateTime.Now.ToString("dd/MM/yy HH:mm:ss");
    }
  }

当我们访问Test1.aspx?timeout=10000,然后在访问Page2.aspx后立即访问时,第二个请求必须等待10秒,直到第一个请求完成。

我今天刚刚学会了这个,并且我已经使用ASP.NET 5年了!直到我在MSDN页面底部(ASP.NET Session State Overview)阅读它之后我才真正相信它。

那么,有没有办法强制并发?也就是说,除了使页面更快,或将长时间运行的代码移动到后台线程之外。我知道你可以把会话只读,但我不完全确定这是一个实用的选择。

3 个答案:

答案 0 :(得分:3)

虽然我刚从问题中了解到这一点,但我确保查看Implementing a Session-State Store Provider中的锁定会话 - 存储数据部分,了解有关其完成原因的详细信息。

基于以上所述,尝试解决该机制似乎并不是一个好主意。

就像你提到的那样,保持请求简短并将长时间运行的代码移出请求线程。此外:

  • 如果您不需要,请禁用该会话。如果您要在该请求中发送任何大的内容,最重要的是这样做。
  • 避免不必要地使用会话。

所有这些都是你应该已经做过的事情。

答案 1 :(得分:1)

据我所知,如果不创建自己的会话状态提供程序,这是不可能的。

(如果您使用SQL Server作为会话存储,那么可能可以破解存储过程以允许并发读取,但绝对不推荐。)

答案 2 :(得分:1)

对于ASP.NET页面,您可以尝试在@ Page指令ReadOnly中更改EnableSessionState值。

.NET Framework 4.5添加了一个新的HttpContext.SetSessionStateBehavior方法,可用于将会话行为设置为整个应用程序