2012-05-12 83 views
4

我有一個WPF客戶端,可以調用2個WCF服務。WPF客戶端 - 我應該在後臺線程中調用WCF服務嗎?

一個服務僅用於查詢,一個服務用於命令(​​)。

我應該如何調用命令服務?

我在某處讀取命令服務中的所有操作必須是「單向」的,因爲它們不應該返回任何值。而且如果出現問題 - 操作應該向客戶端拋出一個'FaultException'。

但是,如果命令都是單向的 - 我在客戶端做什麼?

假設我在WPF客戶端有一個'AddProduct'窗口,然後輸入信息並按下'Save'。

我現在在服務調用 'addProduct命令(產品)',而是:

  1. 它應該關閉窗口?
  2. 是否應該等待10秒才能查看是否沒有FaultException?
  3. 操作而不是是「單向」嗎?如果是這樣 - 命令服務中的所有操作是否應該返回某種類型的'成功'或'失敗'的通用'結果'對象?
  4. 如果第3部分是'是' - 我應該在單獨的線程中調用服務並'禁用'窗口上的所有控件,直到我得到服務的迴應嗎?

感謝。

回答

1

我會說選項3是要走的路,但您可能不需要通用的Result對象來將錯誤傳達給客戶端。正如您可能知道的那樣,異常不會在SOAP消息中序列化,因此您不會在客戶端獲得任何常見的.NET異常。另一方面,您仍然可以通過在客戶端上捕獲FaultException來利用SOAP故障。因此,如果客戶端沒有發現異常情況,那麼一切進展順利。

有關故障異常詳細信息,以及如何使用它們來您的利益,來看看:

Specifying and Handling Faults in Contracts and Services

+0

所以,如果我理解正確的話 - 我需要的所有操作不被單向的,並且都應該返回void。如果一個操作發生故障 - 它應該返回一個'FaultException',否則 - 客戶端知道操作執行正確。 –

+0

因此,這也意味着,調用應該在後臺線程來完成 - 所以我不掛在UI線程在WPF客戶端應用程序。對 ? –

+1

正確。您絕對不應該爲了用戶體驗目的而掛上UI線程。 – Kassem

1

我認爲使用On-方式是好的,但你必須要知道的一些單向呼叫特性。如果你關心並可以處理服務異常,那麼#4是很好的選擇。

單向消息 - 一旦客戶端發出呼叫,WCF就會生成請求消息,但是不會有任何相關消息返回給客戶端。服務端拋出的任何異常都不會傳遞給客戶端。

您需要做的一件事是確保服務的可靠性,以確保該請求已交付給服務。

如果在單向操作調用期間發生異常,沒有傳輸會話(基本或wsHttp綁定)將不受影響,並且它可以繼續在同一個代理實例上發送調用。

如果傳輸會話的存在 - 服務端異常將發生故障的通道,因此客戶端將無法再使用代理服務器來發送更多的電話。這可以讓你選擇發現服務器端是否出現問題(但不是出了什麼問題)。儘管如果服務使用FaultContracts,您仍然可以進入客戶端不知道出現問題的情況。

當服務拋出服務端故障契約中列出的異常時,這不會使通信通道發生故障,因此使用單向協議的客戶端無法檢測到通信故障。

+0

你說:雖然如果服務使用FaultContracts,你仍然可以進入客戶端不知道出現問題的情況........你爲什麼這麼說?你能解釋更多嗎? –

+0

FaultException作爲Fault消息傳遞給客戶端。單向你明確地說沒有響應信息 - 包括故障信息。因此,客戶端將提出請求並繼續前進,贏得;等待響應消息(標準或錯誤)。因此,即使服務遇到錯誤並引發FaultException,客戶端也不會看到錯誤 –

相關問題