2012-12-26 26 views
1

我一直在搜索這個問題幾個小時,但沒有找到任何解決方案。防止XmlHttpRequest對服務器的遞歸調用

我目前在this的應用程序,建立在Meteor

現在情況是,在網站被打開並且所有的資源都被加載到瀏覽器中之後,瀏覽器不斷地進行遞歸xhr調用服務器。這些呼叫以25秒的定期間隔進行。

這可以在瀏覽器控制檯的網絡選項卡中看到。查看圖像中最後一行的待處理請求。

enter image description here

我想不通從那裏起源,以及爲什麼它被自動調用即使用戶處於閒置狀態

現在的問題是,如何禁用這些自動請求?我想手動調用請求,即當菜單項被選中時等。

任何幫助都將被appriciated。

[更新]

爲響應揚德沃夏克的評論:

當我在搜索框中輸入「E」,事件的列表,它具有名稱以字母「e」將被顯示。

請求去與所有有效參數和有效載荷是這樣的:

["{\"msg\":\"sub\",\"id\":\"8ef5e419-c422-429a-907e-38b6e669a493\",\"name\":\"event_Coll_Search_by_PromoterName\",\"params\":[\"e\"]}"] 

這是響應,這是有效的。

a["{\"msg\":\"data\",\"subs\":[\"8ef5e419-c422-429a-907e-38b6e669a493\"]}"] 

這個動作的代碼發佈here

但在自動遞歸請求的情況下,請求不用的有效載荷和響應僅僅是一個字母「H」,這是奇怪的。不是嗎?我怎樣才能擺脫這一點?

+0

這是由您創建的應用程序嗎?如果是這樣,你應該發佈代碼的相關部分。 –

+0

我可以寫一個關於長請求的答案,但我找不到對他們負責的代碼。 –

+0

流星有一個很酷的功能,當你保存一個HTML,它會自動更新客戶端。我建議放棄流星,如果這不能防止生產。 –

回答

6

流星有一個名爲

直播頁面更新功能。

只需編寫您的模板。當數據庫中的數據更改時,它們會自動更新。沒有更多的樣板重繪代碼來編寫。支持任何模板語言。

爲了支持這個功能,Meteor需要在幕後做一些服務器 - 客戶端通信。


傳統上,HTTP被創建用於提取死數據。客戶端告訴服務器它需要一些東西,它會得到一些東西。服務器無法告訴客戶端它需要什麼。之後,它需要將一些數據推送給客戶端。幾個備選方案來生存:

投票:

客戶端向服務器定期請求。服務器響應新數據或立即表示「無數據」。這很容易實現,並且不佔用太多資源。但是,它不完全是活的。它可以用於新聞報道,但對於聊天應用程序來說並不完美。

如果增加輪詢頻率,則會提高更新速率,但資源使用率會隨輪詢頻率而不是數據傳輸速率增加。 HTTP請求並不是很便宜。來自多個客戶端的每秒一次請求可能會嚴重影響服務器。

掛請求:

客戶端向服務器發出請求。如果服務器有數據,則發送它們。如果服務器沒有數據,它會一直做出響應。這些更改會立即提取,不需要傳輸任何數據。但它確實有一些缺點:

如果Web代理髮現服務器處於靜默狀態,它最終會切斷連接。這意味着即使沒有數據要發送,服務器仍然需要發送保持活動響應,以使代理(和網絡瀏覽器)快樂。

掛起請求不會佔用(很多)帶寬,但它們佔用內存。現在的服務器可以處理多個併發的TCP連接,所以它不像以前那樣是個問題。需要考慮的是與保持這些請求的線程相關聯的內存量 - 尤其是當連接綁定到爲它們服務的特定線程時。

瀏覽器對每個域和每個併發請求的總數有嚴格限制。再一次,這比以前更不用擔心了。因此,每個會話只有一個掛起請求似乎是個好主意。

管理掛起的請求感覺有點手動,因爲你必須在每個響應後發出新的請求。 TCP握手也需要一些時間,但我們可以忍受300ms(最壞的情況)的不應期。

分塊響應:

客戶端創建與對應於所述數據流的源隱藏的iFrame。服務器立即響應一個HTTP響應頭,並保持連接處於打開狀態。要發送消息,服務器將其封裝在瀏覽器在收到結束標記時執行的一對<script></script>標記中。好處是沒有連接重新打開,但每條消息的開銷更大。而且,這需要在全局範圍內迴應調用的回調。

此外,由於跨域iFrame通信存在一系列問題,因此無法與跨域請求一起使用。信任服務器的需求也是一個挑戰。

網絡套接字:

這些開始作爲一個正常的HTTP連接,但它們實際上並不遵循HTTP協議以後。從編程的角度來看,事情儘可能簡單。 API是客戶端的經典開放/回調風格,服務器只是將消息推入開放套接字。每封郵件後無需重新打開任何內容。

仍然需要打開連接,但這並不是一個真正的問題,因爲瀏覽器限制了它。瀏覽器知道連接將會打開一段時間,所以它不需要應用與普通請求相同的限制。

這些似乎是理想的解決方案,但有一個主要問題:IE < 10不知道它們。只要IE8還活着,就不能依賴網絡套接字。此外,原生的Android瀏覽器和Opera mini也一樣(ref.)。

儘管如此,網絡套接字似乎是一旦IE8(和IE9)終於死亡的方式。


你看到的掛起請求的時間爲25秒,用於實現實時更新功能。正如我已經說過的那樣,使用keep-alive消息(「h」),以便瀏覽器不認爲它不會得到響應。 「h」只是意味着「沒有任何反應」。 Chrome瀏覽器支持網絡套接字,因此Meteor可以使用它們來滿足長時間的請求,但坦率地說,掛起的請求一旦得到實現後肯定不會很糟糕(當然,瀏覽器連接限制仍然適用) 。

+0

描述性很好的答案,但不能接受它,因爲它不是解決問題的辦法。 –

+0

@SohelKhalifa恐怕沒有Meteor就不可能。不過,我會盡量環顧四周。你爲什麼想要阻止這些請求? –

+0

只是爲了儘量減少服務器上的請求處理負載。 –