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

WCF 從理論到實踐 (10):異常處理三大模式深度解析

     編輯:關於.NET

文章導讀

本文系統闡述 WCF 三種異常處理模式(預設、詳細資訊、自定義錯誤合約)、適用場景、常見異常類型,並以實戰範例驗證各模式行為差異。適合已具備 WCF 基礎的開發人員。

核心知識點

  • 三種異常處理模式的機制與適用場景
  • WCF 三大常見異常類型:通訊、狀態、服務異常
  • 不同實例模式下拋出服務異常的實例行為差異
  • 實戰驗證:預設模式 vs 詳細模式 vs 自定義 FaultContract
  • SOAP 追蹤工具:tcpTrace 與 Trace Utility 實戰

一、WCF 三種異常處理模式

1. 預設模式——資訊隱藏,生產環境首選

  • 客戶端僅收到通用 FaultException,無堆疊追蹤、無業務錯誤細節
  • 目的:防止惡意客戶端從異常推斷伺服器內部結構(資料表、路徑、技術棧)
  • 適用:公開 API、不受信任客戶端、生產環境

2. 包含詳細資訊模式——開發除錯利器

兩種啟用方式:

  1. 配置檔:<serviceDebug includeExceptionDetailInFaults="true" />
  2. 程式碼:[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
  • 客戶端收到完整例外堆疊、訊息、內部例外
  • ⚠️ 嚴禁生產環境開啟,洩露敏感資訊
  • 適用:開發/測試環境、受信任內部客戶端

3. 自定義異常合約——企業級標準化錯誤處理

核心機制:SOAP Fault + FaultException<TDetail>

// 1. 定義資料合約
[DataContract]
public class ExceptionMsg {
    [DataMember] public string Message { get; set; }
    [DataMember] public string ErrorCode { get; set; }
}

// 2. 服務合約標註
[OperationContract]
[FaultContract(typeof(ExceptionMsg))]
int Divide(int x, int y);

// 3. 服務端拋出
throw new FaultException<ExceptionMsg>(
    new ExceptionMsg { ErrorCode = "001", Message = "除數不能為0" },
    new FaultReason("數學運算錯誤")
);

// 4. 客戶端捕獲
catch (FaultException<ExceptionMsg> ex) {
    var detail = ex.Detail; // 強型別存取 ErrorCode、Message
}

二、WCF 三大常見異常類型

異常類型典型原因代表類別處理策略
通訊異常 服務未啟動、網路中斷、防火牆、繫結不匹配 CommunicationException 及衍生類 重試機制、斷路器模式、記錄告警
狀態異常 存取已銷毀的服務實例(PerCall/PerSession 逾期) ObjectDisposedException 檢查 Proxy 狀態、重新建立 Proxy、調整逾時設定
服務異常 業務邏輯驗證失敗、資料庫錯誤、資源不足 FaultException, FaultException<T> 轉換為友善錯誤碼/訊息回傳客戶端、記錄完整日誌

三、實例模式對服務異常行為的影響

當服務拋出 FaultException 時:

InstanceContextMode服務實例客戶端 Proxy
PerCall銷毀失效(Faulted 狀態),需重建
PerSession銷毀失效,需重建
Single存活失效,需重建

關鍵結論:無論何種實例模式,客戶端 Proxy 一旦接收到 FaultException 即進入 Faulted 狀態,必須 Abort() 並重建。Single 模式下服務實例倖存,但該 Session 已中斷。

四、實戰驗證三種模式

1. 預設模式運行結果

預設模式:客戶端僅收到通用異常

客戶端異常訊息不包含伺服器堆疊細節。

2. 詳細資訊模式運行結果

詳細模式:客戶端收到完整堆疊

開啟 includeExceptionDetailInFaults 後,客戶端可見完整伺服器堆疊追蹤。

3. 自定義 FaultContract 運行結果

自定義異常:強型別錯誤碼與訊息

客戶端透過 FaultException<ExceptionMsg> 精準獲取 ErrorCode 與 Message。

4. SOAP 訊息追蹤驗證

使用 Trace Utility (SOAP Toolkit 3.0) 或 tcpTrace 攔截 SOAP 封包:

<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <s:Fault>
      <faultcode>s:Client</faultcode>
      <faultstring xml:lang="zh-CN">The creator of this fault did not specify a Reason.</faultstring>
      <detail>
        <ExceptionMsg xmlns="https://schemas.datacontract.org/2004/07/Jillzhang.Wcf.ExContracts">
          <ErrorCode>001</ErrorCode>
          <Message>除數不能為0</Message>
        </ExceptionMsg>
      </detail>
    </s:Fault>
  </s:Body>
</s:Envelope>

Trace Utility 設定

原始端點位址

修改為追蹤端點位址

追蹤到的 SOAP 訊息

五、跨層除錯技巧:從客戶端追蹤至服務端

除錯設定1

除錯設定2

啟用「非使用者程式碼」除錯、設定符號伺服器、附加至服務宿主進程,實現無縫跨界除錯。

總結

  1. 生產環境:預設模式 + 自定義 FaultContract(標準化錯誤碼、多語系訊息、審計追蹤)
  2. 開發/測試:暫時開啟詳細資訊模式快速定位問題
  3. 異常分類處理:通訊異常→重試/熔斷;狀態異常→重建 Proxy;服務異常→業務邏輯處理
  4. Proxy 生命週期:捕獲 FaultException 後務必 proxy.Abort(),切勿 Close()(會再次拋出異常)
本文配套源碼下載
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved