【发布时间】: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 指令。
标签: asp.net session concurrency