前几天我问了这个问题:
我几乎同时在同一个控制器操作上发出六个 jQuery 异步 ajax 请求。每个请求需要 10 秒才能返回。
通过调试和记录对 action 方法的请求,我注意到请求是序列化的,永远不会并行运行。即我在我的 log4net 日志中看到一个时间线,如下所示:
2010-12-13 13:25:06,633 [11164] 信息 - 得到:1156 2010-12-13 13:25:16,634 [11164] 信息 - 返回:1156 2010-12-13 13:25:16,770 [7124] 信息 - 得到:1426 2010-12-13 13:25:26,772 [7124] 信息 - 返回:1426 2010-12-13 13:25:26,925 [11164] 信息 - 得到:1912 2010-12-13 13:25:36,926 [11164] 信息 - 返回:1912 2010-12-13 13:25:37,096 [9812] 信息 - 得到:1913 2010-12-13 13:25:47,098 [9812] 信息 - 返回:1913 2010-12-13 13:25:47,283 [7124] 信息 - 得到:2002 2010-12-13 13:25:57,285 [7124] 信息 - 返回:2002 2010-12-13 13:25:57,424 [11164] 信息 - 得到:1308 2010-12-13 13:26:07,425 [11164] 信息 - 返回:1308
查看 FireFox 中的网络时间线,我看到:
上面的日志示例和 Firefox 网络时间线都针对同一组请求。
来自同一页面的对同一操作的请求是否被序列化?我知道Session
在同一个会话中对对象的序列化访问,但没有触及任何会话数据。
我将客户端代码剥离为单个请求(运行时间最长的请求),但这仍然会阻止浏览器,即只有当 ajax 请求完成时,浏览器才会响应任何链接点击。
我在这里(在 Chrome 的开发人员工具中)还观察到的是,当一个长时间运行的 ajax 请求正在执行时点击一个链接,它会Failed to load resource
立即报告一个错误,这表明浏览器已经杀死(或试图杀死并等待?)ajax要求:
然而,浏览器仍然需要一段时间才能重定向到新页面。
ajax 请求是否真的是异步的,还是因为 javascript 实际上是单线程的,所以这是一种花招?
我的请求是否需要太长时间才能起作用?
Firefox 和 IE 中也会出现此问题。
我还将脚本更改为$.ajax
直接使用并显式设置async: true
。
我在 IIS7.5 上运行它,Windows 2008R2 和 Windows 7 版本都做同样的事情。
调试和发布版本的行为也相同。