首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 實戰 (10):例外處理三部曲 — 從預設行為到 Fault Contract 企業級最佳實踐

     編輯:關於.NET

一、預設行為:資訊遮蔽

服務端拋出 DivideByZeroException,客戶端僅捕獲泛泛的 FaultException,錯誤訊息為通用內部錯誤,完全無法定位問題。

預設錯誤輸出

二、ServiceDebug 行為:僅供開發除錯

在 <serviceDebug includeExceptionDetailInFaults="true" /> 開啟後,客戶端可捕獲 FaultException<ExceptionDetail>,獲得完整堆疊與訊息。嚴禁生產環境開啟,會洩露敏感資訊。

ServiceDebug 輸出

三、Fault Contract:正式環境標準解法

1. 定義錯誤資料契約

[DataContract]
public class MathError
{
    [DataMember] public string Operation { get; set; }
    [DataMember] public string ErrorMessage { get; set; }
}

2. 於 Service Contract 標註 FaultContract

[ServiceContract]
public interface ICalculator
{
    [OperationContract]
    [FaultContract(typeof(MathError))]
    double Divide(double x, double y);
}

3. 服務端拋出強型別 FaultException

public double Divide(double x, double y)
{
    if (y == 0)
    {
        var error = new MathError { Operation = "Divide", ErrorMessage = "Divided by zero" };
        throw new FaultException<MathError>(error, new FaultReason("Invalid parameters"), new FaultCode("Sender"));
    }
    return x / y;
}

4. 客戶端強型別捕獲

try { result = proxy.Divide(2, 0); }
catch (FaultException<MathError> ex)
{
    var err = ex.Detail;
    Console.WriteLine($"FaultCode: {ex.Code}, Reason: {ex.Reason}, Op: {err.Operation}, Msg: {err.ErrorMessage}");
}

四、WSDL 中的 Fault 定義

啟用 FaultContract 後,WSDL portType 會出現 <wsdl:fault name="MathErrorFault" message="..."/>,XSD 定義 MathError 型別,實現跨平台互通。

WSDL Fault 定義

五、執行結果

FaultContract 捕獲結果

總結

  1. 預設行為資訊不足,不利除錯。
  2. includeExceptionDetailInFaults 僅限開發/測試環境。
  3. FaultContract + FaultException<T> 是生產環境標準做法:強型別、契約優先、跨平台、資訊可控。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved