2009-09-07 71 views
3

我有一個頁面已經在同一時間發出多個AJAX請求。他們使用Comet模型,所以總是有多個HTTP連接打開,等待來自服務器的更多數據。隨着頁面在未來變得越來越複雜,可能會有更多。我擔心打開太多連接。是否可以「複用」來自同一頁面的多個AJAX請求?

我不知道是否有辦法「複用」他們,即。有一個單一連接,所有請求都通過該連接發送,並將消息路由到服務器和客戶端的適當處理函數。

到目前爲止,我找不到一種方法來做到這一點,因爲一旦我發出一個HTTP請求,並開始等待數據,我不認爲有可能發送更多的請求數據。我可以在打開另一個發送更多數據之前關閉該連接,但是如果服務器剛發送響應呢?

我在做我不應該做的事嗎?

回答

1

爲什麼你認爲打開多個連接是不可能的?你試過了嗎?

我們使用的方法是從概念上使用兩個連接:一個用於Comet,所有的異步傳送都是多路複用的,所以許多不同的消息類型都會到達那裏。請求/響應發生在另一個實際上,我們只是編寫了一個傳統的Ajax應用程序,並將Comet作爲額外的應用程序。

+0

有可能有多個連接,這就是我已經有的。如果我打開10個連接並且用戶有幾個打開的頁面實例,我只關心瀏覽器限制。但是隻複用響應是一個有趣的想法,因爲請求連接可能非常短暫。嗯... – EMP 2009-09-07 07:04:47

0

有一個瀏覽器開發人員的協議 - 只有2個同時發送的請求可以發送到同一個子域。這就是爲什麼多個AJAX請求很有用,但要記住隊列。 另一方面JScript調用受安全原因限制爲單個子域。有個小竅門此限跳過(見例如http://www.simple-talk.com/dotnet/asp.net/calling-cross-domain-web-services-in-ajax/節「動態的script標籤黑客」)

+0

我不確定2連接限制是否成立真正的礦石。對於IE8 http://msdn.microsoft.com/en-us/library/cc304129(VS.85).aspx現在已經是6了(它始終可以通過早期版本的IE的註冊表設置進行更改。)我不認爲Chrome會將自己限制爲2。不確定Firefox,Safari或Opera。 – 2009-09-07 07:59:58

+0

@Dave Webb - 如果您在AJAX頁面啓動之前要求您的Web客戶端更改設置,那是相當好奇的。這就是爲什麼我已經告訴記住保持一致。 「爲最壞的情況做好準備」 – Dewfy 2009-09-07 08:55:05

0

最後我做什麼DJNA描述(至少我認爲這是同樣的事情):有一個正常情況下,彗星風格的連接始終打開,不斷監聽響應,但使用新連接發送AJAX請求。每個請求都會立即返回一個「作業ID」(因此連接非常短暫),並且該「作業」的任何其他數據將通過Comet連接發送。這樣,在任何給定時間最多隻能有2個連接,除非同時發生2個AJAX請求,這在我看來不太可能。

當然,可能有多個客戶端一次使用該頁面,因此要確定哪些作業響應需要通過彗星連接發送,我也有一個「彗星會話ID」。該ID在頁面加載時生成,並且在頁面的生命週期中不會更改。在創建作業的正常AJAX請求之後,我會發送另一個非常簡單的AJAX請求以及作業ID和會話ID。這將該作業與會話關聯,並通知服務器將該作業的所有響應發送到與該會話ID關聯的已建立連接。

當然,我可以讓會話ID成爲初始請求的一部分,但這意味着服務器端的每個AJAX方法都需要知道它並且我寧願將它分開,因爲部分基礎設施。

相關問題