2010-03-11 148 views
2

我正在嘗試使用COMET solution using ASP.NET彗星和同步Ajax請求

問題是我想實現發送和通知部分在同一頁。 在IE7上,每當我嘗試發送請求時,它都會排隊等候。 在互聯網和stackoverflow頁面閱讀後,我發現我只能每頁做2個同步異步Ajax請求。

因此,直到我關閉了我的彗星Ajax請求,我的第二個請求沒有完成,甚至沒有從瀏覽器中出去。當我使用Firefox進行檢查時,我只需要運行一個Ajax彗星請求..所以這不會讓我多出一個Ajax請求?

另外該解決方案使用IRequiressessionstate來處理我已刪除的異步HTTP處理程序。但它仍然在IE7的多個實例上產生問題。

我有一個工作圍繞這裏說http://support.microsoft.com/kb/282402
這意味着我們可以從默認的註冊表增加請求限制爲2
通過改變「爲MaxConnectionsPer1_0Server」鍵
在蜂巢「HKEY_CURRENT_USER \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Internet Settings「 我們可以增加請求的數量。

基本上我想廣播信息給連接到使用Comet的服務器的多個客戶端,客戶端也可以發送消息到服務器。
廣播工作,但發回請求回服務器不起作用。

我正在使用IIS 6和ASP.NET。

有沒有更多的解決方法或方法來發送更多請求?

參考文獻:

How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?

AJAX, PHP Sessions and simultaneous requests

jquery .ajax request blocked by long running .ajax request

jQuery: Making simultaneous ajax requests, is it possible?

+0

有2個項目,這可能對您有用: 彗星阿賈克斯ASP.NET:http://pokein.codeplex.com 開源IIS調整工具:http://iistuner.codeplex.com – Zuuum 2011-01-21 08:07:12

回答

5

您僅限於2個連接,但通常情況下,您只需要1個即可發送1個即可在IE中接收。

這就是說,你完全可以做到這一點;我們一直在WebSync。解決方案在於子域。

需要注意的是,IE(和其他瀏覽器,雖然它們通常限制爲6個請求,而不是2個)限制每個域的請求 - 但該限制是針對整個域,不包括子域。因此,例如,您可以向「www.stackoverflow.com」打開2個請求,並在同一時間打開2個「static.stackoverflow.com」請求。

現在,您必須小心使用這種方法,因爲如果您從www子域向靜態子域請求,這被認爲是跨域請求,所以您立即被限制爲不使用直接呼叫XHR,但此時您已經繞過了2個連接限制; JSONP,HTML5等,都是您的朋友,用於繞過跨域限制。

編輯

與IE> 1個實例管理回來同樣的問題。該限制適用於所有實例。所以,如果你有兩個瀏覽器打開,並且它們都使用彗星,你會被打開兩個長輪詢連接。如果你已經最大化了你的選擇,你將會把這些長輪詢請求連接到「comet.mysite.com」之類的東西,而你的非長輪詢請求將會轉到「mysite.com」。沒有進入通配符DNS,這是最好的。

看看我們的一些WebSync Demos;他們在2個IE瀏覽器中工作沒有問題。如果您查看源代碼,您將看到流式連接的DNS與主頁面不同;我們使用JSONP來繞過跨域限制。

+0

Thx.I可以使用IE的一個實例進行發送和接收,但不會超過此限制。 – Amitd 2010-03-11 13:54:13

2

彗星的主要思路是保持一個客戶端到服務器的請求開放,直到響應是必要的。

如果您正確設計代碼,則不需要超過2個請求同時打開。下面是它如何工作的:

  • 客戶端使用中央郵件發送 - 接收環路請求發送出去
  • 服務器收到請求並保持其開放的服務器。
  • 在某些時候,服務器響應客戶端。
  • 客戶端(瀏覽器)接收到響應,在中央消息循環中處理它。
  • 立即客戶端發出另一個請求。
  • 重複

的關鍵是集中和asynchronize在客戶端的所有通信。所以你永遠不需要有2個打開的請求。

但是要直接回答你的問題,不,沒有其他的解決方法。

提高連接限制或減少您使用的連接數。

+0

是的,我同意,客戶端重複請求的一部分運行良好。 問題是,我不能再開放一個連接到服務器 (不Comet ..simple ajax)同時發送數據到它。 – Amitd 2010-03-11 13:44:09

+0

有解決方法,請參閱上面的我的答案。 – jvenema 2010-10-28 16:39:16