2016-09-14 64 views
0

我正在使用WCF中的SOAP客戶端與自託管的WCF服務進行通信,以遠程控制我正在開發的一款軟件。該軟件的運行時間非常長(可以稱之爲Print),運行時間可能會持續幾分鐘,也可能長達一小時。我試圖找出如何實現方法Print給出了以下要求:對長時間運行的服務器端方法實現客戶端調用的正確方法

  1. 服務器應該能夠籌集FaultExceptions到客戶端,萬一出了差錯。
  2. 如果與服務的連接丟失,應儘快通知客戶端。
  3. 如果斷開連接,服務器端進程Print應該繼續運行,以便客戶端可以重新連接並繼續監視進程並在必要時中止進程。

由於我是WCF的新手,我不確定如何實現這一點。我現在看到兩種選擇:

  1. Print一個async方法,讓我可以「射後不理」,直到它完成或拋出一個FaultException。這看起來很直接,但我看到這個「問題」:WCF中有一個客戶端請求超時,默認值爲1分鐘,這也適用於async方法(如果我沒有弄錯)以及我將因此得到哪些大幅增加。這看起來有點像黑客。 async方法StartPringing啓動服務器端的任務打印和直接返回(或拋出一個異常的情況下,出現錯誤)和客戶機 -
  2. 通過拆分其行爲爲實施的Print自己的async行爲回調方法PrintingFinished。然後,我可以使用回調PrintingFinished向客戶端發出信號,當打印進程完成或使用額外的回調PrintingFailed發送異常以防出現問題時。這個實現將被隱藏在async方法Print之後,因此它的行爲方式可能會引發異常。在這裏,我看到以下挑戰:我將不得不實施整個異常回調 - 自己處理異常,以處理在StartPringing返回後發生的異常(從StartPringing本身我可以拋出FaultExceptions)。

對於這兩種情況,我將不得不探討如何檢測,當連接被串聯(我目前在服務上使用ping方法),然後以某種方式獲取該事件以從內部拋出異常方法Print。在實現方面,這看起來與備選方案(2)更加一致,因爲我需要在打印過程完成或引發異常時實施所有其他事件處理程序。然而我不確定我會如何實現這個替代(1)。

那麼,兩種選擇中的哪一種是「更好的」。更好地說,我的意思是以下考慮因素: 1.與WCF中的「標準」方式一致以實現如此長時間運行的方法。 2.可維護性和可擴展性。

如果我應該考慮任何其他選擇,我會感激任何其他建議。

回答

0

對於我所瞭解的您的問題,我認爲如果您需要使用像MSMQ這樣的消息隊列的可靠性的真正異步通信。您可以使用WCF使用它:https://msdn.microsoft.com/en-us/library/ms789048(v=vs.110).aspx

更新

在你的情況,你可以使用SOAP調用打印命令發送到服務器,因爲它同步,你需要知道,如果服務器處理請求。在打印操作之後是漫長而異步的。當這個操作完成(例外與否)它需要通知客戶端。但客戶端可能會關閉例如。對於該通信,Message Queue是解決方案,MQ確保消息將被傳輸。 https://en.wikipedia.org/wiki/Message_queue

如果你不想使用MSMQ,可以實現對客戶端的Web服務由打印服務器被通知,例如使用UUID在內存或在匹配的地圖調用和通知數據庫。

+0

感謝您的回答。你能否詳細說明一下,爲什麼你認爲我需要MSMQ?我的印象是WCF中的請求被轉移,如果沒有,我會得到某種通信例外。詳細闡述我的實現:我使用net.tcp綁定,所有通信都將在本地網絡上進行。我不知道MSMQ(我是WCF新手),但MSMQ通信看起來還有更多工作需要實施。我想採用符合KISS原則的方法,因爲我只有一個長時間運行的方法(如果需要的話忘記我的問題的可擴展性部分)。 – packoman

+0

只是爲了擴展我的評論以及爲什麼我猶豫不決:我已經使用net.tcp綁定解決了大部分實現細節。 「唯一」缺失(確實很大)的部分是我在問題中詳細描述的方法的實現。所以這就是爲什麼我不願意切換綁定而沒有充分理由這樣做。我會非常感謝您的意見... – packoman

+0

感謝您的答案更新。因此,讓我們假設我在開始打印過程之後跳過「異步」部分。我的想法是當連接丟失時,讓Print方法拋出一個「斷開」異常。然後,客戶的工作是重新連接到服務並檢查打印設備處於什麼狀態(即,「打印」是否仍在運行或完成)。我已經預見到諸如「打印機活動狀態」之類的屬性,客戶端的用戶可以使用它來檢查打印機的狀態並在重新連接後進行相應的操作。在這種情況下,我不需要MSMQ,對嗎? – packoman

相關問題