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)阅读它之后我才真正相信它。
那么,有没有办法强制并发?也就是说,除了使页面更快,或将长时间运行的代码移动到后台线程之外。我知道你可以把会话只读,但我不完全确定这是一个实用的选择。
答案 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方法,可用于将会话行为设置为整个应用程序