2009-01-28 78 views
3

我想實現一個WebService,其中包含一個方法,其答覆將被延遲少於1秒到大約一個小時(取決於數據是否已被緩存或需要取回)。WebService和輪詢

基本上我的問題是,如果您只能從客戶端連接到WebService(無法通知),那麼實現此功能的最佳方法是什麼?

AFAIK這將只能通過使用某種投票。但是輪詢很糟糕,所以我寧願避免使用它。另一個極端可能是隻要方法沒有完成就讓連接保持打開狀態。但我想這可能會放慢網絡服務器和網絡。我想將這兩種技術結合起來。然後,客戶端會調用該方法,服務器將在至少10秒後返回客戶端需要重新輪詢的消息或實際結果。

您的想法是什麼?

回答

3

你可能想看看comet

+3

多年後,你會想看看叫做[WebSockets]的彗星的標準格式(http://tools.ietf.org/html/rfc6455)。在[SuperWebSocket](http://superwebsocket.codeplex.com/)上有一個.NET實現。 – ladenedge 2012-09-30 05:16:00

1

我想的東西,這可能需要一個小時響應Web服務是不使用的最佳機制。

爲什麼輪詢不好?當然,如果你調整輪詢的頻率,它不會那麼糟糕。可能會使民意調查之間的時間增加一倍,最多約五分鐘。

0

我一直在使用的一些Web服務在無法立即響應時返回「請再次嘗試」xml消息。我意識到這只是對輪詢技術的一種改進,但如果服務器可以在請求時確定可能的延遲將會發生什麼,它可以告訴客戶端,然後忘記它,從而將客戶端輪詢間隔過期後再詢問一次。

0

在IIS和客戶端有超時,這將阻止你離開連接打開。 這也不實用,因爲資源/連接在服務器上被阻塞。

爲什麼你想要用戶等待這麼長時間運行的任務?讓他們在某處查找操作的狀態。

2

我建議一種智能輪詢的,如果可能的話:

  • 在第一次請求,返回一個標記來表示該請求。這是在將來的請求中呈現的內容,因此很容易檢查該請求是否真的完成。
  • 在將來的請求,保持連接打開了一定的時間(例如一分鐘,可能在客戶端上指定的),並返回要麼結果的「依然沒有結果的結果,請再試一次X「,其中X是您完成答案時的最佳猜測。

優點:

  • 您允許客戶端使用「保持連接開放」的模式相對昂貴(在連接方面),但允許響應,因爲它已經準備好儘快送達。確保你不要在每個連接上都保留一個線程! (並且有某種時間限制...)
  • 通過說什麼時候客戶端應該回來,你可以實現退避策略 - 即使你不知道什麼時候準備好,你可以有一個「回退1,2,4,8,16, 30,30,30,30 ...「分鐘政策。 (您應該檢查客戶是否忽略這一點。)您不會因爲長時間的錯失而導致大量浪費的民意調查,但您仍然可以快速獲得快速結果。