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

Posted

技术标签:

【中文标题】使用 ASP.NET 会话时是不是可以强制请求并发?【英文标题】:Is it possible to force request concurrency when using ASP.NET sessions?使用 ASP.NET 会话时是否可以强制请求并发? 【发布时间】:2011-04-11 18:47:58 【问题描述】:

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) 时,我才真正相信它。

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

【问题讨论】:

哇,我从 1.0 开始就一直在使用它,但也不知道 :( 这在我使用过的任何应用程序中都不是问题,但我想知道那是什么在使用会话的应用程序中执行某些操作,然后继续将大型下载文件发送到浏览器。事实上,我刚刚闪回了我在文件处理程序中禁用会话,因为我们计划将会话移出进程将来,我想知道为什么要找出下载阻止应用程序的原因会有多大的头疼...... 赞成,因为这个问题也一直在我脑海中浮现。密切相关:此并发限制是否也适用于 [WebMethod(EnableSession = true)] 的 ASMX Web 服务调用? 到目前为止,在我的测试中,它甚至比 nbolton 描述的还要糟糕;即使 Test2 没有访问/更改 Session,它仍然会阻塞,直到 Test1 完成。我可以解决此问题的唯一方法是将 EnableSessionState="False" 显式设置为 Test2 上的 Page 指令。 另见:***.com/questions/3666556/… 和 ***.com/questions/8989648/… 【参考方案1】:

虽然我刚刚从这个问题中了解到这一点,但我会确保检查 Implementing a Session-State Store Provider 中的 Locking Session-Store Data 部分,以获取有关其完成原因的更多信息。

基于上述情况,尝试绕过该机制似乎并不是一个好主意。

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

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

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

【讨论】:

如果你想尝试实现一个自定义的 Session-State Provider 来解决这个问题,我发现这篇 MSDN 文章 Session State Providers 很有帮助,尤其是它澄清了何时调用 GetItem 和 GetItemExclusive。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于使用 ASP.NET 会话时是不是可以强制请求并发?的主要内容,如果未能解决你的问题,请参考以下文章

ajax 请求是不是会导致更新 asp.net 会话?

使用 WIF 和 jquery ajax 请求时 ASP.NET MVC 3 中的会话 Cookie 过期处理

ASP.Net Core 2.1 API JWT 无 cookie 会话?

电话间隙 HTML 应用程序可以与 asp.net Mvc Web 服务器建立会话吗

在 Ajax 调用期间保持 ASP.Net 会话处于活动状态

清除cookie并强制每次用户访问网站时登录?