2009-08-26 50 views
4

上下文: 從我的JavaScript Web UI中,我啓動了一個在.NET2.0後端進行的長時間運行(幾分鐘)操作。該調用立即返回操作ID,而長時間運行並行運行。這些操作不是CPU密集型的,但是進行緩慢的網絡呼叫。操作完成後,我想在Web UI中查看結果。如何在沒有投票的情況下通知我的JS客戶端?

問題:如何在工作完成後通知客戶?

選項我已考慮:

選項1:我異步直接從JS啓動長時間運行的操作,我希望返回值是endresult,而不是操作ID。我的AJAX庫負責處理所有事情,生活看起來非常簡單,整潔。問題是,在服務器端線程是一個ThreadPool線程,我現在鎖定了幾分鐘。即使有足夠的處理能力,您也不需要太多長時間運行的並行請求,導致ThreadPool陷入飢餓狀態,並將整個服務器帶回其膝部。

選項2:使用操作ID,我開始輪詢服務器,如果操作完成。但是,這是對我自己的服務器的拒絕服務攻擊。此外,它必須有公平的Ajax解決方案。這不是一個獨特的問題。

回答

3

檢出WebSync,一個.NET的彗星實現。應該是你正在尋找的。

0

隱藏的(或小的)iframe如何運行長時間運行的腳本並使javascript僅檢查iframe的內容?例如腳本在其末尾將ID寫入iframe。

3

輪詢,如果正確完成,將不會對您的服務器負載有明顯的影響。您應該自定義時間間隔以最好地覆蓋您的服務器作業的具體內容 - 例如如果您知道該操作通常需要更長時間,則至少需要2分鐘才能輪詢服務器。即使在此之後,你選擇了足夠大的間隔 - 例如10秒。使用Web服務請求或自定義處理程序可以最大限度地減少處理請求所需的通信量和服務器時間。

0

你的選擇2正是我以前所做的。使用setTimeout限制每30秒左右的輪詢。

2

也許反向ajax是有用的,如果你不會有太多的併發客戶端。這有時被稱爲彗星。

反向Ajax指的是一種Ajax設計模式,它使用長期HTTP連接來啓用Web服務器和瀏覽器之間的低延遲通信。基本上它是一種將數據從客戶端發送到服務器的方式,以及將服務器數據推送回瀏覽器的機制(您需要)。

http://en.wikipedia.org/wiki/Reverse_Ajax

聽起來像它可能滿足您的需求,我只是用它和它的工作非常出色。

+0

我見過一些基於瀏覽器的即時通訊客戶端發出長時間超時的服務器HTTP請求。只要服務器有一些數據推送到客戶端,服務器就可以回覆。我想這是一回事。 – 2009-08-26 11:52:01

+0

是的,它可以被看作是從服務器到客戶端的推送。當然你仍然需要長壽命的http連接,這就是爲什麼你不需要成千上萬的同時連接。 – 2009-08-26 12:33:55

0

ICEfaces Framework提供AJAX Push技術。他們支持可擴展異步請求處理在各種應用程序服務器,如Jetty,Tomcat和Glassfish。

雖然這是所有的Java的東西,它可能有助於找到正確的谷歌搜索條件。

相關問題