【发布时间】:2010-12-13 11:37:19
【问题描述】:
几天前我问了这个问题:
我几乎同时在同一个控制器操作中触发了六个 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 对象的序列化访问,但没有触及会话数据。 p>
我将客户端代码剥离为单个请求(运行时间最长的请求),但这仍然会阻塞浏览器,即只有当 ajax 请求完成时,浏览器才会响应任何链接点击。
我在这里(在 Chrome 的开发人员工具中)还观察到的是,在执行长时间运行的 ajax 请求时单击链接时,它会立即报告 Failed to load resource 错误,这表明浏览器已终止(或正在尝试终止)并等待?)ajax请求:
但是浏览器仍然需要一段时间才能重定向到新页面。
ajax 请求真的是异步的,还是因为 javascript 实际上是单线程的,所以这是一种花招?
我的请求是否需要太长时间才能生效?
Firefox 和 IE 也会出现此问题。
我还将脚本更改为直接使用$.ajax,并显式设置async: true。
我在 IIS7.5 上运行它,Windows 2008R2 和 Windows 7 版本都做同样的事情。
调试和发布版本的行为也相同。
【问题讨论】:
-
你在 Firefox/IE 中测试过这个吗?也许是 chrome 问题?
-
@aseem - 在 F/Fox 和 IE 中是一样的
-
也许你的脚本改变了其他地方的异步设置。
-
发送多个请求时,您能否签入 FF/Firebug(Firebug 中的 Net Panel)。那些时间日志似乎不对,jquery ajax 请求肯定是异步的,必须并行运行。
-
@aseem - 请求标头中没有“发送”时间。我要说的是,因为它们都被一次请求,Firefox(或谷歌)无法按任何合理的顺序排序。存在的顺序是由于每个底层 XHR 响应并确认“是的,确实我已发送此请求”所花费的时间,因此由于制作 TCP/IP 的差异,每个 XHR 之间可能存在几毫秒的差异联系。因此出现了乱序的时间线。但是我知道事实上这些调用是序列化的(控制器操作中的日志记录告诉我这一点)......继续......
标签: javascript jquery asp.net-mvc ajax asp.net-mvc-2