我編碼Web服務,並調用Web服務B.如何做異步工作作爲網絡服務的一部分?
一旦我驗證輸入到AI要回報成功代碼和然後調用B.
方面,我正在考慮:
- 看我是否可以派生一個工作線程,在A返回後完成。
- 對代理或服務進行編碼以調用B並使用可靠的隊列傳輸驗證的參數。
運行環境是由ASP.NET web應用程序託管的Service.svc。
我該怎麼做?
更新:我只想說,答案都是有用的。我決定標記我用過的那個。
我編碼Web服務,並調用Web服務B.如何做異步工作作爲網絡服務的一部分?
一旦我驗證輸入到AI要回報成功代碼和然後調用B.
方面,我正在考慮:
運行環境是由ASP.NET web應用程序託管的Service.svc。
我該怎麼做?
更新:我只想說,答案都是有用的。我決定標記我用過的那個。
一旦我驗證輸入到AI要返回一個成功代碼,然後調用B.
在這種情況下,你應該把工作納入一個持久性隊列(MSMQ,天青總線等) ,然後才返回成功代碼。另一個系統(不在ASP.NET中託管;即Azure工作者角色,Win32服務等)應從隊列中檢索工作並調用B.
這是執行此操作的唯一可靠方法。菲爾哈克有一個good blog post爲什麼在ASP.NET中執行這兩個部分是一個壞主意;它歸結爲回收。有關回收觸發器here和here的更多信息。
異步Web服務是否具有該博客文章中描述的相同風險? – 2013-03-06 15:52:50
不正常。默認情況下,在所有異步操作完成之前,ASP.NET都不會發送它的響應。因此,當沒有線程處理請求時,可能會有一段時間(當「異步」I/O正在進行時),但沒關係,因爲響應尚未發出。 *發送迴應後,您嘗試做功*時會出現問題; IIS和ASP.NET並不是爲這種情況設計的。 – 2013-03-06 15:56:36
此代碼項目鏈接應爲您提供創建穩定Async Communication with Windows Communication Foundation所需的所有信息。
書有很多這種形式的通信的處理:按步驟
希望幫助
該文章看起來很不錯..所以Begin調用的返回值將是我在問題中提到的成功代碼,對吧? – 2013-03-06 00:52:55
是的。我相信是這樣。 – Greg 2013-03-06 02:22:02
你的第二個想法是一個好主意。將異步部分發送到Windows服務。如果你需要可靠性,那麼使用消息隊列來做。在任何情況下,您都可以使用WCF將請求發送到其他服務。
這個問題並不是特定於任何特定的服務接口。一般來說,你的決定取決於你爲什麼要調用異步的東西:
隨着每個後續的框架版本> 3,這些方法變得更容易。5,並且我相信其他答案能夠幫助您深入瞭解如何在c#中啓動,繼續和/或等待異步任務結果。
是的,這些答案一直有用..我在你的(1)情況 - 客戶端是一個實時系統,需要低延遲,但我的其他要求是在驗證輸入後立即調用另一個Web服務 - 因爲我無法控制其他Web服務的延遲,我不想依賴於它的低(實際上我知道空閒後第一次通話需要高達30秒)。 – 2013-03-06 01:41:40
是的,你絕對是在#1場景中。您想要啓動該任務,並返回可用於檢查其狀態的ID。據推測,第二個(較慢的)Web服務調用將僅僅更新一些在給定ID的情況下仍然可以看到的東西;這是一個非常經典的用例設計,所以我不會在這裏喋喋不休。我假設您有某種鍵/值緩存來存儲任務狀態。 – 2013-03-06 01:49:36
您可以通過幾種方式做到這一點,您使用的是什麼Web服務? WCF?肥皂?休息? – Greg 2013-03-05 23:31:30
這是一個在MVC網站中託管的WCF Web服務。 – 2013-03-06 00:03:13