Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ASP.NET会话时是否可以强制请求并发?_Asp.net_Session_Concurrency - Fatal编程技术网

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

使用ASP.NET会话时是否可以强制请求并发?,asp.net,session,concurrency,Asp.net,Session,Concurrency,ASP.NET不允许同时请求同一会话;这意味着用户一次只能发出一个请求 例如,假设我们有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(Requ

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

例如,假设我们有
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"]));
    }
  }
  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");
    }
  }
。。。和
Test2.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"]));
    }
  }
  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页面的底部看到它,我才真正相信它()


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

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


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

虽然我刚刚从问题中了解到这一点,但我会确保检查中的锁定会话存储数据部分,以了解有关为什么这样做的更多信息

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

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

  • 如果不需要,请禁用会话。最重要的是,如果您在该请求中发送任何较大的内容,请执行此操作
  • 避免不必要地使用会话

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

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


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

哇,我从1.0开始就在使用它,但也不知道:(这在我使用过的任何应用程序中都不是问题,但我想知道,如果一个应用程序使用会话进行某些操作,然后继续向浏览器发送一个大的下载文件,那么这会起到什么作用。事实上,我刚刚在一个文件处理程序中看到了我禁用会话的闪回画面,因为我们计划在将来将会话移出进程,我想知道找出下载阻止应用程序的原因会让人头痛多大…Upvote因为这个问题也在我脑海中出现了一段时间。非常密切相关:这个并发限制是否也适用于ASMX webservice调用,其中[WebMethod(EnableSession=true)]?到目前为止,在我的测试中,它甚至比nbolton描述的更糟糕;即使Test2没有访问/更改会话,它仍然会阻塞,直到Test1完成。解决这个问题的唯一方法是显式设置EnableSessionState=“False”作为Test2上的页面指令。另请参见:如果您想尝试实现一个自定义会话状态提供程序来解决此问题,我发现这篇MSDN文章很有帮助,特别是它澄清了何时调用GetItem和GetItemExclusive。