2009-05-03 37 views
0

你好,感謝您的意見。wcf架構設計。重新:返回值

我正在創建一個web服務。 這個網絡服務將接受客戶和客戶帳戶以及一些其他相關的對象和屬性等。

當webservice收到請求時,我試圖處理它。
如果沒有錯誤,我只是簡單地返回。如果出現錯誤,我就扔掉它。

我想知道如果這是最好的方法,或者如果我應該修改我的設計,以便我返回一個布爾作爲響應,甚至創建一個響應對象,可能包含原始請求對象加上狀態和如果錯誤,則列出錯誤(即:丟失字段,無效字段,分機)。

您將在設計中採用哪種返回方法?
1)如果沒有錯誤就返回,如果錯誤拋出錯誤 2)bool成功 3)響應對象(包含原始請求對象?和詳細結果)?

感謝您的任何建議。 史蒂芬

回答

0

我會說這取決於'錯誤'是什麼。如果錯誤與驗證相關,但在正常事件過程中預期,例如將無效的用戶憑據傳遞給提供用戶身份驗證的服務,則返回指示請求結果(成功,失敗等)的枚舉值可能是確定的。但是,如果錯誤是由於在正常事件過程中不應發生的輸入所致,那麼我建議您從服務操作中拋出錯誤。拋出錯誤表示客戶端應用程序出錯,並提供了服務不知道如何處理的輸入。您可以使用WCF服務操作來註冊特定的錯誤合約,以便客戶端應用程序知道在特定情況下操作可能會拋出許多錯誤之一。客戶端應用程序應爲這些故障提供異常處理程序,並在引發時採取相應措施,否則會意外終止。作爲一個基本的經驗法則,我會說特殊情況下拋出錯誤,例如,客戶已經提供了服務操作不期望接收的輸入。如果客戶提供的信息不正確,但服務操作已編制完畢,請在響應消息中返回狀態代碼或信息。

0

我認爲這取決於誰將會使用這項服務,

如果你將使用這項服務,我建議你返回任何(或原始請求),如果東西拋出異常的唯一一個是錯的。

如果服務是公用的,你應該返回一些將包含錯誤的響應對象,以及其他一些相關的數據。

祝你好運

+0

陳建民你好。 感謝您的回覆。我沒有忘記提及這不是一個內部應用程序,並且它將被可能不會使用wcf的外部客戶使用。如果響應對象還包含原始請求,您會看到任何好處嗎,還是會過度殺傷? – stevenrosscampbell 2009-05-03 13:32:53

+0

我認爲你不需要返回請求,除非你必須。 如果你只能返回一個簡單的字符串或數字,那麼將會是結果類型的一些關鍵字(你將在某個站點發布結果的含義),這將是最好的,因爲你允許任何技術與你的服務一起工作。 – 2009-05-05 19:39:25

1

作爲一般的經驗法則:如果環境不允許您成功完成請求,則拋出異常。如果您想要傳回其他信息,例如訂單號碼等,請使用返回值。通常不是一個好主意,通過布爾返回值發回完整的失敗信息 - 這可能會被忽略/未被調用者檢查。

現在,由於它是外部源使用的WCF服務,因此您不應該引發異常 - 這是.NET特定的事情 - 而是拋出SOAP錯誤。您應該將這些故障申報爲每運行服務的優惠服務合同的組成部分,通過添加一個或多個FaultContract屬性您的操作:通過拋出的FaultException或

[FaultContract(typeof(MyFault1))] 
[FaultContract(typeof(MyFault2))] 
[OperationContract] 
void MyOperation() 

可以在.NET WCF很容易做到這一點一個更具體的FaultException(一個通用變體,您可以在其中指定exakt類型的故障)。

Marc