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

WF 4.0 工作流服務異常處理:FaultException 與 FaultContract 完整實作

     編輯:關於.NET

問題背景

使用 ReceiveAndSendReply 活動範本與 WorkflowServiceHost 建立工作流服務時,預設缺乏指定 SOAP 錯誤 (Fault) 的機制。若直接拋出 .NET 例外,客戶端只會收到一般通訊例外,無法獲得結構化錯誤資訊。

解決方案:雙 SendReply 模式

  1. 在 Receive 活動上右鍵新增第二個 SendReply (第一個為正常回應)。
  2. 建立錯誤資料合約類別 (如 FaultDetail) 並標記 [DataContract]/[DataMember]。
  3. 於工作流中以 Throw 活動拋出 FaultException<FaultDetail>,第二個 SendReply 設定為傳回該 Fault。

程式碼範例

錯誤資料合約

using System.Runtime.Serialization;
namespace ServicesAndFaults {
  [DataContract]
  public class FaultDetail {
    [DataMember] public int Data { get; set; }
  }
}

工作流設計

  • Receive:接收請求。
  • SendReply (正常):回傳正常結果。
  • Throw:初始化 new FaultException<FaultDetail>(new FaultDetail { Data = 42 }, new FaultReason("Error"))。
  • SendReply (錯誤):Action 設為 Fault 動作,內容繫結至 Throw 的例外變數。

客戶端呼叫

var proxy = new ServiceClient();
try {
  Console.WriteLine(proxy.GetData(42));
}
catch (FaultException<FaultDetail> ex) {
  Console.WriteLine("FaultException<FaultDetail> with {0}", ex.Detail.Data);
}
catch (FaultException ex) {
  Console.WriteLine(ex);
}

進階:不終止工作流的錯誤回應

若業務流程不宜因單一錯誤中斷 (如長期訂單處理),可移除 Throw 活動,直接在第二個 SendReply 內建構並回傳 FaultException 或 FaultException<T>。此時工作流會繼續執行後續活動,控制台輸出會顯示 "the workflow finishing" 訊息。

關鍵設定摘要

設定項目說明
FaultDetail 類別[DataContract] + [DataMember] 定義錯誤資料結構
第二個 SendReplyAction = Fault 動作,內容繫結 FaultException 變數
Throw 活動決定是否終止工作流;保留則終止,移除則繼續
客戶端捕獲優先捕獲 FaultException<T>,再捕獲基底 FaultException
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved