javascript - 为什么对同一 ASP.NET MVC 操作的多个同时 AJAX 调用会导致浏览器阻塞?

标签 javascript jquery asp.net-mvc ajax asp.net-mvc-2

几天前我问了这个问题:

Why does $.getJSON() block the browser?

我几乎同时在同一 Controller 操作中发出六个 jQuery 异步 ajax 请求。每个请求需要 10 秒才能返回。

通过调试和记录对操作方法的请求,我注意到请求是序列化的,从不并行运行。即我在我的 log4net 日志中看到这样的时间线:

2010-12-13 13:25:06,633 [11164] INFO   - Got:1156
2010-12-13 13:25:16,634 [11164] INFO   - Returning:1156
2010-12-13 13:25:16,770 [7124] INFO   - Got:1426
2010-12-13 13:25:26,772 [7124] INFO   - Returning:1426
2010-12-13 13:25:26,925 [11164] INFO   - Got:1912
2010-12-13 13:25:36,926 [11164] INFO   - Returning:1912
2010-12-13 13:25:37,096 [9812] INFO   - Got:1913
2010-12-13 13:25:47,098 [9812] INFO   - Returning:1913
2010-12-13 13:25:47,283 [7124] INFO   - Got:2002
2010-12-13 13:25:57,285 [7124] INFO   - Returning:2002
2010-12-13 13:25:57,424 [11164] INFO   - Got:1308
2010-12-13 13:26:07,425 [11164] INFO   - Returning:1308

查看 FireFox 中的网络时间线,我看到了这个:

alt text

上面的日志示例和 Firefox 网络时间线都针对同一组请求。

来自同一页面的相同操作的请求是否序列化?我知道在同一 session 中对 Session 对象的序列化访问,但没有 session 数据是被感动。

我将客户端代码剥离为单个请求(运行时间最长的请求),但这仍然会阻塞浏览器,即只有当 ajax 请求完成时,浏览器才会响应任何链接点击。

我在这里(在 Chrome 的开发人员工具中)还观察到,在执行长时间运行的 ajax 请求时单击链接后,它会立即报告 Failed to load resource 错误,这表明浏览器已经杀死(或试图杀死并等待?)ajax 请求:

alt text

但是浏览器仍然需要一段时间才能重定向到新页面。

ajax 请求真的是异步的还是这种花招是因为 javascript 实际上是单线程的?

我的请求是不是花了太长时间才起作用?

Firefox 和 IE 也会出现这个问题。

我还更改了脚本以直接使用 $.ajax 并显式设置 async: true

我在 IIS7.5 上运行它,Windows 2008R2 和 Windows 7 版本做同样的事情。

调试和发布版本的行为也相同。

最佳答案

答案就在眼前。

ASP.NET Session State Overview:

Access to ASP.NET session state is exclusive per session, which means that if two different users make concurrent requests, access to each separate session is granted concurrently. However, if two concurrent requests are made for the same session (by using the same SessionID value), the first request gets exclusive access to the session information. The second request executes only after the first request is finished.

令人恼火的是,几周前我浏览了这段内容,但并未真正理解粗体句子的全部影响。我读到的只是“对 session 状态的访问是序列化的”而不是“所有请求,无论您是否触摸 session 状态,都是序列化的”如果请求来自同一 session 。

幸运的是,在 ASP.NET MVC3 中有一个解决方法,它可以创建无 session Controller 。 Scott Guthrie 在这里谈到了这些:

Announcing ASP.NET MVC 3 (Release Candidate 2)

我安装了 MVC3 RC2 并升级了项目。用 [SessionState(SessionStateBehavior.Disabled)] 装饰有问题的 Controller 解决了这个问题。

当然,通常我几分钟前才在 Stack Overflow 中发现这个:

Asynchronous Controller is blocking requests in ASP.NET MVC through jQuery

关于javascript - 为什么对同一 ASP.NET MVC 操作的多个同时 AJAX 调用会导致浏览器阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4428413/

相关文章:

javascript - 找不到图像,因为 `/` 添加在 URL 末尾

php - 使用类似条件jquery访问文本字段

javascript - jquery - 使用 WHEN 和 DONE 序列化 ajax 调用

c# - 为什么 HttpContext 为空?

javascript - 如何在 ASP.NET MVC 中 foreach 内部脚本标记

c# - 如何动态设置模型而不导致 Razor 页面中的完整回发 (.NetCore 5.1)

javascript - 永久更改具有功能的按钮(正常+按下)的图像

javascript - 条件导入仍然是 Webpack 中 bundle 的一部分

javascript - CSS 如何让粒子留下一条逐渐消失的轨迹?

javascript - 如何在异步函数中抛出错误并仅在非直接调用者中处理它?