我有一个 javascript web 应用程序设置为使用 .net 服务器的长轮询,使用 ajax 调用:
var _listenTimeout = 5 * 60 * 1000;
//...
$.ajax({
type: "GET",
url: url,
async: true,
cache: false,
dataType: "jsonp",
timeout: _listenTimeout,
success: callback
});
但是,当页面打开一段时间后,对服务器的请求会停止响应。它似乎处于一种不确定状态,数据包被卡在 Web 浏览器之间并被从网络发送到服务器。
我已经挖掘了,我知道一些事情:
- 请求被发送是因为它显示在 chrome web 开发人员网络选项卡(也是 chrome://net-internals)和 firebug 上。请求的状态始终处于挂起状态,它只是停滞在该状态。
- 请求 url 是正确的,因为通过发送相同的 url 会
curl
返回立即响应。 - 它没有离开我的网络,因为没有使用wireshark检测到任何数据包。服务器日志(以及那一侧的wireshark)也没有显示任何内容。
奇怪的是,有时它会偶尔工作,但会延迟几分钟,即浏览器网络日志检测到请求得到响应(在我的情况下为 204),wireshark 检测到正在发送的请求(并在服务器端)。浏览器和wireshark的延迟相同,即发出请求,发生延迟,然后chrome检测响应,wireshare检测发送的数据包。
页面的干净刷新也解决了这个问题,几乎立即发生相同的请求/响应(使用相关的浏览器网络和 wireshark 日志)。
我已经在 Chrome 21.0.1180.89 和 Firefox 14.01 上尝试过。
是否有某种浏览器队列被 ajax 请求阻塞在浏览器中?或者可能有太多并发请求?暂时不知道...