我遇到了一个难以描述的问题。我将从重现步骤开始,然后继续详细说明。所以一般步骤:
- 在网站上运行长时间运行的操作(更改报告状态、POST)
- 尝试在同一浏览器中打开另一个页面,但另一个选项卡(列出报告、GET)
- 尝试打开与步骤 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/