faultcode、faultstring,選擇性 faultactor、detail。Code、Reason,選擇性 Node、Role、Detail。支援子代碼表達更細粒度錯誤。兩者本質相似:皆定義錯誤代碼、人類可讀描述、錯誤發生者與詳細資訊。
MessageFault 以 SOAP 版本無關方式描述錯誤,配合 WCF 分層架構,提供處理訊息與產生例外的極大彈性。
faultcode/Code,工廠方法自動產生 Sender/Receiver 等標準代碼,支援子代碼。faultstring/Reason,支援多語言文化特定描述。Exception,第 9 章將說明契約設計影響。FaultCode faultCode = FaultCode.CreateReceiverFaultCode("MyFaultCode", "urn:MyNS");
FaultReason faultReason = new FaultReason("The value must be > 10");
SomeFaultDetail faultDetail = new SomeFaultDetail("Contoso", "SomeApp");
MessageFault messageFault = MessageFault.CreateFault(faultCode, faultReason, faultDetail);
同一個 MessageFault 實例,搭配不同 MessageVersion 即可產出 SOAP 1.1 或 1.2 Fault 訊息:
Message message = Message.CreateMessage(version, messageFault, "urn:SomeFaultAction");
輸出對比顯示:
SOAP 1.1 使用 faultcode/faultstring/detail;
SOAP 1.2 使用 Code/Subcode/Reason/Detail。
核心價值:WCF 基礎結構僅在傳輸層決定 SOAP 版本,實現熱插拔與可擴充架構。
| 子元素 | 說明 |
|---|---|
| faultcode | 識別故障代碼 |
| faultstring | 人類可讀說明 |
| faultactor | 引發故障者資訊 |
| detail | 應用程式專用錯誤資訊 |
| 錯誤代碼 | 描述 |
|---|---|
| VersionMismatch | Envelope 命名空間無效 |
| MustUnderstand | 無法理解 mustUnderstand=1 的 Header 子元素 |
| Client | 訊息構成錯誤或資訊不正確 |
| Server | 伺服器端問題無法處理 |