上下文: 從我的JavaScript Web UI中,我啓動了一個在.NET2.0後端進行的長時間運行(幾分鐘)操作。該調用立即返回操作ID,而長時間運行並行運行。這些操作不是CPU密集型的,但是進行緩慢的網絡呼叫。操作完成後,我想在Web UI中查看結果。如何在沒有投票的情況下通知我的JS客戶端?
問題:如何在工作完成後通知客戶?
選項我已考慮:
選項1:我異步直接從JS啓動長時間運行的操作,我希望返回值是endresult,而不是操作ID。我的AJAX庫負責處理所有事情,生活看起來非常簡單,整潔。問題是,在服務器端線程是一個ThreadPool線程,我現在鎖定了幾分鐘。即使有足夠的處理能力,您也不需要太多長時間運行的並行請求,導致ThreadPool陷入飢餓狀態,並將整個服務器帶回其膝部。
選項2:使用操作ID,我開始輪詢服務器,如果操作完成。但是,這是對我自己的服務器的拒絕服務攻擊。此外,它必須有公平的Ajax解決方案。這不是一個獨特的問題。
我見過一些基於瀏覽器的即時通訊客戶端發出長時間超時的服務器HTTP請求。只要服務器有一些數據推送到客戶端,服務器就可以回覆。我想這是一回事。 – 2009-08-26 11:52:01
是的,它可以被看作是從服務器到客戶端的推送。當然你仍然需要長壽命的http連接,這就是爲什麼你不需要成千上萬的同時連接。 – 2009-08-26 12:33:55