2012-09-19 39 views
4

我有一个JavaScript的Web应用程序设置为使用长轮询与.NET服务器发送,使用Ajax调用:AJAX长轮询不从浏览器

var _listenTimeout = 5 * 60 * 1000; 
//... 
$.ajax({ 
     type: "GET", 
     url: url, 
     async: true, 
     cache: false, 
     dataType: "jsonp", 
     timeout: _listenTimeout, 
     success: callback 
}); 

然而,有一个问题,当页面已经打开了一段时间,对服务器的请求停止响应。它似乎处于一种缓冲状态,数据包在Web浏览器之间卡住,并从网络发送到服务器。

我周围挖,我知道一两件事情:

  • 请求被发送,因为它表明了Chrome网上应用开发者网络选项卡上(也铬://网内部)和萤火虫。请求的状态始终处于待处理状态,并且仅在该状态下停止。
  • 请求网址是正确的,因为通过curl发送相同的网址会立即返回响应。
  • 它还没有离开我的网络,因为没有使用wireshark检测到任何数据包。服务器日志(和那边的wireshark)也不显示任何内容。

奇怪的是,有时工作断断续续,但一两分钟即的延迟,浏览器网络日志检测该请求得到响应(在我的情况下,204),和Wireshark检测该请求正在发送(并在服务器端收到)。浏览器和wireshark的延迟是相同的,即发出请求,发生延迟,然后chrome检测到响应,wirehare检测到发送的数据包。

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

我已经在Chrome 21.0.1180.89和Firefox 14.01上试过了。

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

+0

'chrome:// net-internals'存在多久了?太棒了**! – Neal

+1

你能详细说一下吗? Chrome显示请求正在被创建,但你从字面上没有得到任何回应......就像没有标题或任何东西一样?但是连接成功了? Wireshark根本没有显示数据包,或只是不显示你期望看到的内容?你可以在错误的界面上嗅探吗? – Brad

+0

@Brad - 更新了更多细节的问题。希望他们回答你的所有问题,即wireshark在干净的页面刷新上检测到相同的URL请求。 – zlog

回答

0

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

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

+1

我们使用长轮询(http://en.wikipedia.org/wiki/Push_technology#Long_polling),所以它应该工作。 'setTimeout'不起作用,因为服务器会用长轮询将更新推送到浏览器。 – zlog

+0

@zlog感谢您的澄清。 – Amareswar