從服務行爲設置
<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));
來源
2015-05-04 16:54:46
BSG
謝謝,但我試了一下。我開始使用一個常規的異常,並且當它不起作用時,切換到FaultException。然後我嘗試了自定義異常方法,但是我沒有將所有代碼複製到我的原始問題中以節省空間。這一切都行不通,這就是爲什麼我問這個問題。我正在做所有我讀過的文章都說要做的事,但沒有成功。我嘗試了includeExceptionDetailInFaults錯誤和真實,它也沒有任何區別。任何其他想法? Thx再次 –
我剛剛更新了我的答案,你可以請在代碼中再次使用該示例嗎? – BSG
不,同樣的問題。我甚至嘗試過簡化它並使用一個字符串...拋出新的FaultException(「缺少PCR編號」,新的FaultReason(「缺少PCR編號」)),但它沒有奏效。仍然在客戶端獲得通用消息。我在服務方法中添加了[FaultContract(typeof(string))]。有任何想法嗎? Thx再次。 –