2015-05-04 46 views
0

我想獲得WCF服務來返回自定義錯誤,以便客戶端知道發生了什麼。儘管閱讀了無數關於如何做到這一點的文章,但沒有任何作用。無論我做什麼,我都會得到通用的「此故障的創建者未指定原因」消息。自定義WCF錯誤錯誤不起作用

我曾嘗試以下...

throw new FaultException("It brok!"); 

...,並嘗試...

throw new FaultException<VrtSystemNotFoundException>(new VrtSystemNotFoundException()); 

...但客戶永遠只能看到標準的FaultException。

任何任何想法我做錯了什麼?在客戶端中,我只是將服務調用包裝在try/catch塊中,並檢查異常。

我在使用Visual Studio 2013的情況下,它有任何區別。

回答

1

從服務行爲設置

<serviceDebug includeExceptionDetailInFaults="True" />: 

從WCF服務,拋出該異常,如下圖所示:

throw new Exception("Custom Exception"); 

在客戶端,你將得到的FaultException與消息「自定義例外」。

注意:在生產中,您必須保持includeExceptionDetailInFaults =「False」以限制服務向客戶端發送敏感信息。

您不能將自定義錯誤消息作爲服務異常拋出。爲了拋出定製的錯誤消息,你必須定義一個數據合同類型並將其作爲錯誤。看下面的例子。

[DataContract] 
public class OrderFault 
{ 
[DataMember] 
public int OrderId { get; set; } 

[DataMember] 
public string Message { get; set; } 
} 

爲了拋出故障客戶端,我們必須指定使用FaultContractAttribute方法/操作上述預期的故障如下:

[OperationContract] 
[FaultContract(typeof(OrderFault))] 
OrderType GetOrder(int orderId); 

現在,在客戶端,你必須抓住故障如下:

catch (FaultException<OrderFault> ex) 
{ 
} 

在catch中,可以使用ex.Detail獲取異常詳細信息。在我們的例子中,它是OrderFault。

就是這樣。通過這種方式,您可以將自定義錯誤消息作爲WCF服務的錯誤並在客戶端中使用。

注意:即使您拋出操作故障,如果您沒有爲操作指定預期的故障,在客戶端,您將不會收到故障。

FaultException的Message屬性是錯誤頁面顯示的內容,所以如果沒有填充它,您將看到'該錯誤的創建者沒有指定一個Reason'消息。要輕鬆填充它,在服務投擲故障時,如下所示,從故障類型通過你的錯誤消息顯示在下面的例子

InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started"); 

throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason(fault.ErrorMessage));          
+0

謝謝,但我試了一下。我開始使用一個常規的異常,並且當它不起作用時,切換到FaultException。然後我嘗試了自定義異常方法,但是我沒有將所有代碼複製到我的原始問題中以節省空間。這一切都行不通,這就是爲什麼我問這個問題。我正在做所有我讀過的文章都說要做的事,但沒有成功。我嘗試了includeExceptionDetailInFaults錯誤和真實,它也沒有任何區別。任何其他想法? Thx再次 –

+0

我剛剛更新了我的答案,你可以請在代碼中再次使用該示例嗎? – BSG

+0

不,同樣的問題。我甚至嘗試過簡化它並使用一個字符串...拋出新的FaultException (「缺少PCR編號」,新的FaultReason(「缺少PCR編號」)),但它沒有奏效。仍然在客戶端獲得通用消息。我在服務方法中添加了[FaultContract(typeof(string))]。有任何想法嗎? Thx再次。 –

1

何哼使用這兩個參數的構造函數。事實證明,它不工作的原因是我們團隊的WCF專家爲客戶添加了行爲擴展,這使得我們的服務能夠發送更多詳細的異常。然而,我從一個單獨的VS項目測試我的代碼,並沒有引用這個額外的庫,所以所有的異常都被轉換爲標準的FaultException。

一旦我添加了對庫的引用,並將其配置到測試客戶端的app.config中,它工作正常。

這個故事的故事是,如果有什麼東西應該工作,而不是,檢查是否有人聰明做了一些聰明的事情,而不是告訴你!

感謝所有回覆的人。