使用 ReceiveAndSendReply 活動範本與 WorkflowServiceHost 建立工作流服務時,預設缺乏指定 SOAP 錯誤 (Fault) 的機制。若直接拋出 .NET 例外,客戶端只會收到一般通訊例外,無法獲得結構化錯誤資訊。
Receive 活動上右鍵新增第二個 SendReply (第一個為正常回應)。FaultDetail) 並標記 [DataContract]/[DataMember]。Throw 活動拋出 FaultException<FaultDetail>,第二個 SendReply 設定為傳回該 Fault。using System.Runtime.Serialization;
namespace ServicesAndFaults {
[DataContract]
public class FaultDetail {
[DataMember] public int Data { get; set; }
}
}
new FaultException<FaultDetail>(new FaultDetail { Data = 42 }, new FaultReason("Error"))。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] 定義錯誤資料結構 |
| 第二個 SendReply | Action = Fault 動作,內容繫結 FaultException 變數 |
| Throw 活動 | 決定是否終止工作流;保留則終止,移除則繼續 |
| 客戶端捕獲 | 優先捕獲 FaultException<T>,再捕獲基底 FaultException |