2014-01-16 41 views
1

我遇到了难以描述的问题。我将从重现的步骤开始,然后继续细节。因此,在一般的步骤:同时开始的两个并行请求一个接一个地执行

  1. 经营的网站上长期运行的操作(变更申报状态,POST)
  2. 尝试在同一浏览器中打开另一个页面,而另一个选项卡(表报告,GET)
  3. 尝试打开同一个页面上的步骤2,但使用其他浏览器/隐身模式下

这样做的结果是: 比方说,第一个操作需要80秒,完成后,第二操作时间与第一个完全相同,但是,最感兴趣的是什么第三个完成不到1秒。所有3个请求都使用相同的凭据。

该应用程序使用ASP.NET MVC 3构建; IIS 8.5,.NET v4.5应用程序池。没有数据库锁。

长时间运行的操作是对同一应用程序中托管的内部asmx Web服务(许多调用,一个接一个,平均执行时间为1.5秒)进行调用。所有步骤都使用同一控制器的不同方法。

这里是IIS log步骤(步骤1-线67,步骤2-线68步骤3-线14)。

尽管步骤3没有任何延迟地执行,为什么通过运行步骤2有这样的超时?


编辑:

感谢@arknotts,似乎这是一个会话锁定。

只是想分享一些链接,这些谁都会面临同样的问题:

回答

1

默认情况下,ASP.NET只允许每次会话一次运行一个请求。在此期间的任何其他请求将排队。当请求#1正在运行时,请求#2被阻塞,直到第一个完成。请求#3处理得很好,因为它被分配了与其他会话不同的会话(通过使用隐身模式/其他浏览器)。你可以做两件事情:

  • 禁用会话状态
  • 如果禁用会话状态是不是一种选择,你需要生成的请求#1一个新的线程,并立即返回到浏览器。
相关问题