2013-03-05 81 views
2

我編碼Web服務,並調用Web服務B.如何做異步工作作爲網絡服務的一部分?

一旦我驗證輸入到AI要回報成功代碼和然後調用B.

方面,我正在考慮:

  • 看我是否可以派生一個工作線程,在A返回後完成。
  • 對代理或服務進行編碼以調用B並使用可靠的隊列傳輸驗證的參數。

運行環境是由ASP.NET web應用程序託管的Service.svc。

我該怎麼做?

更新:我只想說,答案都是有用的。我決定標記我用過的那個。

+0

您可以通過幾種方式做到這一點,您使用的是什麼Web服務? WCF?肥皂?休息? – Greg 2013-03-05 23:31:30

+0

這是一個在MVC網站中託管的WCF Web服務。 – 2013-03-06 00:03:13

回答

2

一旦我驗證輸入到AI要返回一個成功代碼,然後調用B.

在這種情況下,你應該把工作納入一個持久性隊列(MSMQ,天青總線等) ,然後才返回成功代碼。另一個系統(不在ASP.NET中託管;即Azure工作者角色,Win32服務等)應從隊列中檢索工作並調用B.

這是執行此操作的唯一可靠方法。菲爾哈克有一個good blog post爲什麼在ASP.NET中執行這兩個部分是一個壞主意;它歸結爲回收。有關回收觸發器herehere的更多信息。

+0

異步Web服務是否具有該博客文章中描述的相同風險? – 2013-03-06 15:52:50

+0

不正常。默認情況下,在所有異步操作完成之前,ASP.NET都不會發送它的響應。因此,當沒有線程處理請求時,可能會有一段時間(當「異步」I/O正在進行時),但沒關係,因爲響應尚未發出。 *發送迴應後,您嘗試做功*時會出現問題; IIS和ASP.NET並不是爲這種情況設計的。 – 2013-03-06 15:56:36

2

此代碼項目鏈接應爲您提供創建穩定Async Communication with Windows Communication Foundation所需的所有信息。

書有很多這種形式的通信的處理:按步驟

  • WCF在多層框架
  • 希望幫助

    • WCF步驟。我會給你一些例子,但Code Project的教程應該提供你所需要的。

    +0

    該文章看起來很不錯..所以Begin調用的返回值將是我在問題中提到的成功代碼,對吧? – 2013-03-06 00:52:55

    +0

    是的。我相信是這樣。 – Greg 2013-03-06 02:22:02

    1

    你的第二個想法是一個好主意。將異步部分發送到Windows服務。如果你需要可靠性,那麼使用消息隊列來做。在任何情況下,您都可以使用WCF將請求發送到其他服務。

    1

    這個問題並不是特定於任何特定的服務接口。一般來說,你的決定取決於你爲什麼要調用異步的東西:

    1. 如果你只是想給客戶一個 長時間運行的方法調用快速響應,調用您的異步方法,並立即 回報令牌(任務ID等),可用於稍後檢查任務的進度。
    2. 如果你有幾個長期運行的方法來執行,你主要是想異步調用通過並行以提升效率,在一開始就&調用任何你可以繼續使用一切不依賴於以前的方法。等待返回結果完成所需的任何任務,或者等待下一個任務開始。
    3. 在大多數情況下,我會給客戶端在具有狀態標記的同步和異步方法之間進行選擇;如果他們想繼續下去,他們可以稍後再回來查看,如果在繼續之前獲得該結果很重要,那麼這也是一個選擇。

    隨着每個後續的框架版本> 3,這些方法變得更容易。5,並且我相信其他答案能夠幫助您深入瞭解如何在c#中啓動,繼續和/或等待異步任務結果。

    +0

    是的,這些答案一直有用..我在你的(1)情況 - 客戶端是一個實時系統,需要低延遲,但我的其他要求是在驗證輸入後立即調用另一個Web服務 - 因爲我無法控制其他Web服務的延遲,我不想依賴於它的低(實際上我知道空閒後第一次通話需要高達30秒)。 – 2013-03-06 01:41:40

    +0

    是的,你絕對是在#1場景中。您想要啓動該任務,並返回可用於檢查其狀態的ID。據推測,第二個(較慢的)Web服務調用將僅僅更新一些在給定ID的情況下仍然可以看到的東西;這是一個非常經典的用例設計,所以我不會在這裏喋喋不休。我假設您有某種鍵/值緩存來存儲任務狀態。 – 2013-03-06 01:49:36