AJAX长轮询不从浏览器发送

时间:2012-09-19 16:56:26

标签: javascript ajax browser

我有一个javascript网络应用程序设置为使用.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上。请求的状态始终处于暂挂状态,并且只是在该状态下停止。
  • 请求网址是正确的,因为通过curl发送相同的网址会立即回复。
  • 由于没有使用wireshark检测到任何数据包,因此未离开我的网络。服务器日志(以及那边的wireshark)也没有显示任何内容。

奇怪的是,有时它偶尔会工作,但延迟几分钟,即浏览器网络日志检测到请求得到响应(在我的情况下是204),wireshark检测到发送的请求(并在服务器端收到)。浏览器和wireshark的延迟是相同的,即发出请求,发生延迟,然后chrome检测到响应,并且wireshare检测到发送的数据包。

页面的干净刷新也解决了问题,几乎立即发生相同的请求/响应(使用相关的浏览器网络和wireshark日志)。

我在Chrome 21.0.1180.89和Firefox 14.01上尝试过它。

是否有某种浏览器队列在浏览器中被ajax请求阻塞?或许too many concurrent requests?现在不知道......

1 个答案:

答案 0 :(得分:0)

$ .ajax不会定期发出请求。 timeout选项指定实际请求不用于轮询的延迟。在这里阅读它。 http://api.jquery.com/jQuery.ajax/。这就是为什么你只看到一个ajax请求。如果你想手动,你必须使用setTimeout javascript方法。

您可以在成功和错误回调中调用setTimeout,以便您可以摆脱并发的ajax请求。