2012-05-06 28 views
0

我有一個面向WCF服務的因特網,它調用局域網內的幾個其他服務。 此呼叫可能需要幾秒鐘才能完成。WCF從jquery調用很長的過程

我通過jQuery調用此WCF服務,並在線程返回響應後更新UI。

我想要做的是確保如果用戶在服務運行時導航到另一個頁面,通過jquery(在新頁面上)的第二次調用將不會在另一個線程上再次啓動該進程。

是否有任何模式或WCF功能來控制此類行爲?

回答

0

你的問題在於瀏覽器是無狀態的。一個頁面中的HTML,CSS和JavaScript從另一個頁面加載到完全獨立的上下文中。因此,即使您的進程繼續運行,它們也無法將數據返回到頁面,因爲它不再被加載。

這聽起來像你想確保即使用戶更改頁面你的UI更新。這可以通過使用Comet來實現。

彗星工作方式是通過從瀏覽器打開HTTP請求到服務器。然後,服務器將該連接保持打開狀態,直到它有數據需要推送回客戶端。當服務器準備好時,它將響應發送給客戶端。

雖然此技術通常用於在發生更改時使用新數據更新N個客戶端,但您可以使用此技術將您的響應與特定請求分離。換句話說,您可以設置您的應用程序,以便向服務器發出的請求不會收到響應。相反,服務器會通過彗星連接傳遞更新。

這將確保任何發出請求然後更改頁面的客戶端在計算結果後仍會收到UI更新。

許多主要的平臺都支持Comet:Java,PHP,.NET,node.js是我所知道的支持這種技術的一些。另一種獲得支持的類似技術是WebSockets;然而,並非所有的瀏覽器都支持這種技術。首先在你選擇的特定平臺上對Comet進行一些研究,如果你有更具體的問題,你可以在這裏問問他們。祝你好運!

+0

謝謝你的迴應!我會看彗星。該網站是經過身份驗證的用戶唯一網站,因此我想也許我可以使用會話來模擬全狀態感。 –

+0

您面臨的問題是,您仍然需要在新頁面上提出請求才能獲取數據,並且由於您不想重新開始計算結果的過程,所以您會被困在岩石和堅硬的地方之間。即使有會話,您的新頁面也不知道其他線程正在發生什麼,只能將其自己的請求發送給服務器。彗星確保在數據準備就緒後實際向客戶端推送數據,而不需要輪詢服務器,無論哪個進程或頁面作出原始請求。 – jmort253

+0

我想你也可能有2個進程,一個是「計算數字」請求,計算你的結果並將其存儲在緩存中,然後是一個「給我數據」請求,它只是返回緩存中的內容,但我可以看到變得漂亮複雜和資源密集型,因爲您需要輪詢服務器以瞭解數據何時準備就緒。這個問題恰恰是彗星想要解決的問題。 – jmort253