同时启动的两个并行请求一个接一个地执行

时间:2014-01-16 17:55:45

标签: asp.net asp.net-mvc iis deadlock

我遇到了一个难以描述的问题。我将从重现步骤开始,然后继续详细信息。所以步骤一般:

  1. 在网站上运行长时间运行的操作(更改报告状态,POST)
  2. 尝试在同一浏览器中打开另一个页面,但另一个选项卡(列表报告,GET)
  3. 尝试打开与第2步相同的页面,但使用其他浏览器/隐身模式
  4. 结果是: 比方说,第一个操作需要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行)。

    为什么运行步骤2会出现超时,尽管步骤3没有任何延迟执行?


    编辑:

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

    只想为那些将面临同样问题的人分享一些链接:

1 个答案:

答案 0 :(得分:3)

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

  • 禁用会话状态
  • 如果禁用会话状态不是一个选项,则需要为请求#1生成一个新线程并立即返回浏览器。