我有一个在IIS中运行的ASP.NET站点,我注意到如果一个页面很慢,似乎运行缓慢,所以我设置了一个测试,看它是否在运行,好像它是一个单独的线程(即如果一个页面请求正在运行,则所有其他请求必须等待)。我创建了一个非常简单的页面(没有母版页,只有默认的aspx代码,除了我添加了一个Literal来转储调试代码),代码读取当前时间,睡眠10秒,然后退出,如下所示:
protected void Page_Load(object sender, EventArgs e)
{
DateTime now = DateTime.Now;
System.Threading.Thread.Sleep(10000);
Literal1.Text = now.ToShortDateString() + " " + now.ToShortTimeString() + " " + now.Second + ":" + now.Millisecond;
}
然后我同时在两个不同的标签页面中打开页面。每个选项卡上的时间戳几乎相隔10秒,这在我看来意味着第二个页面请求被阻止并等待第一个页面请求在运行之前完成。
我尝试在web.config中注释掉所有http模块并禁用Global.asax中的所有代码,但我仍然看到这个问题。
答案 0 :(得分:10)
这听起来像会话状态问题。
对每个会话的访问ASP.NET会话状态是独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果对同一会话发出两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。 [...]
来源:ASP.Net Session State Overview
尝试在web.config中禁用会话状态(或将其标记为只读)以确认这确实是问题,或使用两个不同的浏览器(获得不同的会话)。