服務端拋出 DivideByZeroException,客戶端僅捕獲泛泛的 FaultException,錯誤訊息為通用內部錯誤,完全無法定位問題。

在 <serviceDebug includeExceptionDetailInFaults="true" /> 開啟後,客戶端可捕獲 FaultException<ExceptionDetail>,獲得完整堆疊與訊息。嚴禁生產環境開啟,會洩露敏感資訊。

[DataContract]
public class MathError
{
[DataMember] public string Operation { get; set; }
[DataMember] public string ErrorMessage { get; set; }
}
[ServiceContract]
public interface ICalculator
{
[OperationContract]
[FaultContract(typeof(MathError))]
double Divide(double x, double y);
}
public double Divide(double x, double y)
{
if (y == 0)
{
var error = new MathError { Operation = "Divide", ErrorMessage = "Divided by zero" };
throw new FaultException<MathError>(error, new FaultReason("Invalid parameters"), new FaultCode("Sender"));
}
return x / y;
}
try { result = proxy.Divide(2, 0); }
catch (FaultException<MathError> ex)
{
var err = ex.Detail;
Console.WriteLine($"FaultCode: {ex.Code}, Reason: {ex.Reason}, Op: {err.Operation}, Msg: {err.ErrorMessage}");
}
啟用 FaultContract 後,WSDL portType 會出現 <wsdl:fault name="MathErrorFault" message="..."/>,XSD 定義 MathError 型別,實現跨平台互通。


includeExceptionDetailInFaults 僅限開發/測試環境。