asp.net - 同时启动的两个并行请求依次执行

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

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

  1. 在网站上运行长时间运行的操作(更改报告状态、POST)
  2. 尝试在同一浏览器中打开另一个页面,但另一个选项卡(列出报告、GET)
  3. 尝试打开与步骤 2 相同的页面,但使用其他浏览器/隐身模式

结果是: 比方说,第一个操作需要 80 秒才能完成,第二个操作与第一个操作所需的时间完全相同,但是,最有趣的是,第三个操作只需不到 1 秒即可完成。所有 3 个请求都使用相同的凭据。

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

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

这里是IIS log步骤(步骤 1 - 第 67 行、步骤 2 - 第 68 行、步骤 3 - 第 14 行)。

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


编辑:

感谢@arknotts,看来这是一个 session 锁。

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

最佳答案

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

  • 禁用 session 状态
  • 如果无法禁用 session 状态,则需要为请求 #1 生成一个新线程并立即返回浏览器。

关于asp.net - 同时启动的两个并行请求依次执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21169293/

相关文章:

javascript - 如何将基于表单的身份验证从 iPhone 应用程序传递到网站?

asp.net - 在 ASP.NET 4.6 MVC 应用程序中引用 .NET Core 类库

c# - 在下拉列表的 selectedindexchanged 后没有页面刷新?

asp.net-mvc - 在浏览器中的特定页面打开 PDF

iis - 通过 HTTP 访问 SSAS

c# - ASP.net Core WebAPI 不在 IIS 后面启动

c# - 如何使用 C# 将数据属性添加到下拉菜单

asp.net-mvc - Facebook 分享图片的最小像素大小

c# - 如何自动访问具有 "require client certificates"的 IIS 网站?

c# - "File does not begin with ' %PDF- '."尝试加载 PDF 时出错 - ASP.NET MVC