2012-09-19 65 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