在 Windows Communication Foundation (WCF) 的錯誤處理過程中,除非拋出 FaultException(或其子類型),或實現 FaultContract,否則不會將例外狀況訊息傳回給用戶端。 因此,您只能在這些案例中追蹤錯誤訊息本身的數據。 回呼實作中的例外狀況會自動回復為 ServerFault 和 ClientFault 追蹤點的錯誤訊息。 不過,它一律會傳回具有通用訊息的通用錯誤。 如需 WCF 錯誤合約的詳細資訊,請參閱 https://go.microsoft.com/fwlink/?LinkId=83132。
您也可以透過錯誤追蹤點來追蹤常數和內容屬性。
如果使用 IncludeExceptionDetailInFaults 屬性在錯誤中傳回例外狀況詳細數據,您可以透過 XPath 擷取實際的例外狀況訊息。
錯誤處理是由 GetServiceContractCallPoint 中定義的錯誤追蹤點所提供:
服務錯誤
客戶錯誤
CallbackFault
使用這些故障追蹤點時,即使在基於交易的場景中運作,故障數據仍然會被保存。 在所有未針對錯誤進行追蹤的數據上維持交易完整性,並在發生錯誤時將這些數據回復到先前狀態。
備註
這些追蹤點會套用至回復路徑,並僅適用於 GetServiceContractCallPoint 所提供的 ServiceReply、ClientReply 和 CallbackReply 服務合約呼叫點。
錯誤設定範例
下列範例示範當服務在 AuthorizationServiceFault 事件中擲回 FaultException 時,追蹤 ServiceFault 上的例外狀況訊息;否則它會追蹤 AuthorizationServiceReply 事件中作業所傳回的布爾表達式。 AuthorizationServiceReply 的 OnEvent 或 AuthorizationServiceFault 的 OnEvent 會被持久保存。
備註
此範例的實現展示了 ServiceReply 和 ServiceFault 追蹤點之間的互斥性。
<ic:OnEvent IsBegin ="true" IsEnd="false" Name="AuthorizationServiceReply" Source="ESCreditCardService">
<ic:Filter>
<ic:Expression>
<wcf:Operation Name="GetServiceContractCallPoint"/>
<ic:Operation Name ="Constant">
<ic:Argument>ServiceReply</ic:Argument>
</ic:Operation>
<ic:Operation Name ="Equals"/>
<wcf:Operation Name="GetOperationName" />
<ic:Operation Name="Constant">
<ic:Argument>AuthorizeWithDataContract</ic:Argument>
</ic:Operation>
<ic:Operation Name ="Equals" />
<ic:Operation Name ="And" />
</ic:Expression>
</ic:Filter>
<ic:CorrelationID>
<ic:Expression>
<wcf:Operation Name="AutoGenerateCorrelationToken"/>
</ic:Expression>
</ic:CorrelationID>
<ic:Update DataItemName="Status" Type="NVARCHAR">
<ic:Expression>
<ic:Operation Name="Constant">
<ic:Argument>Success</ic:Argument>
</ic:Operation>
</ic:Expression>
</ic:Update>
<ic:Update DataItemName="Result" Type="NVARCHAR">
<ic:Expression>
<wcf:Operation Name ="XPath">
<wcf:Argument>//s:Body/ccservice:*/ccservice:AuthorizeWithDataContractResult</wcf:Argument>
</wcf:Operation>
</ic:Expression>
</ic:Update>
<ic:Update DataItemName ="Service Call Date" Type ="DATETIME">
<ic:Expression>
<wcf:Operation Name ="GetContextProperty">
<wcf:Argument>EventTime</wcf:Argument>
</wcf:Operation>
</ic:Expression>
</ic:Update>
</ic:OnEvent>
<ic:OnEvent IsBegin ="true" IsEnd="false" Name="AuthorizationServiceFault" Source="ESCreditCardService">
<ic:Filter>
<ic:Expression>
<wcf:Operation Name="GetServiceContractCallPoint"/>
<ic:Operation Name ="Constant">
<ic:Argument>ServiceFault</ic:Argument>
</ic:Operation>
<ic:Operation Name ="Equals"/>
<wcf:Operation Name="GetOperationName" />
<ic:Operation Name="Constant">
<ic:Argument>AuthorizeWithDataContract</ic:Argument>
</ic:Operation>
<ic:Operation Name ="Equals" />
<ic:Operation Name ="And" />
</ic:Expression>
</ic:Filter>
<ic:CorrelationID>
<ic:Expression>
<wcf:Operation Name="AutoGenerateCorrelationToken"/>
</ic:Expression>
</ic:CorrelationID>
<ic:Update DataItemName="Status" Type="NVARCHAR">
<ic:Expression>
<ic:Operation Name="Constant">
<ic:Argument>Fault</ic:Argument>
</ic:Operation>
</ic:Expression>
</ic:Update>
<ic:Update DataItemName="Source" Type="NVARCHAR">
<ic:Expression>
<wcf:Operation Name ="XPath">
<wcf:Argument>//s:Body/Fault/Reason/Text</wcf:Argument>
</wcf:Operation>
</ic:Expression>
</ic:Update>
<ic:Update DataItemName ="Service Call Date" Type ="DATETIME">
<ic:Expression>
<wcf:Operation Name ="GetContextProperty">
<wcf:Argument>EventTime</wcf:Argument>
</wcf:Operation>
</ic:Expression>
</ic:Update>
</ic:OnEvent>