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

Nic*_*ton 10 asp.net concurrency session

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"]));
    }
  }
Run Code Online (Sandbox Code Playgroud)

......和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");
    }
  }
Run Code Online (Sandbox Code Playgroud)

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

我今天刚刚学会了这个,我已经使用ASP.NET 5年了!直到我在MSDN页面底部(ASP.NET会话状态概述)中读到它,我才真正相信它.

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

egl*_*ius 3

尽管我刚刚从问题中了解到这一点,但我一定要检查实现会话状态存储提供程序中的锁定会话存储数据部分,以获取有关其完成原因的更多信息。

基于以上所述,尝试绕过该机制似乎确实不是一个好主意。

正如您所提到的,保持请求简短并将长时间运行的代码移出请求线程。此外:

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

无论如何,所有这些都是你应该已经在做的事情。