拥有 FaultContracts 的目的首先是可以从服务中传回 SOAP 错误,这不会破坏服务器和客户端之间的通信通道(优雅且可互操作地处理 .NET 异常等错误条件),其次,使用 FaultContracts,您的服务器会抛出类型错误 ( FaultException<T>
),而您的客户端可以捕获这些错误。
如果您想要或需要真正具有互操作性,您需要:
- 将所有 FaultContract 类型定义为用 [DataContract] 属性修饰的类
- 捕获服务器上的所有 .NET 异常(使用例如 IErrorHandler 接口)并将它们转换为可互操作的 SOAP 错误
如果你控制了线的两端,而且两端都是.NET,那么你可以将这一步简化:在服务器上,处理所有.NET异常,并把它们变成eg FaultException<ArgumentOutOfRangeException>
,即创建一个“故障(无论.NET)。 NET 异常)”,然后在客户端上,捕获那些键入的 FaultException 并处理它们:
[FaultContract(typeof(ArgumentOutOfRangeException)]
[OperationContract]
public void CallService(.......)
然后在你的实现中,使用这个:
try
{
clientProxy.CallService();
}
catch(FaultException<ArgumentOutOfRangeException> ex)
{
// handle the most specific exception first
}
catch(FaultException ex)
{
// handle all other, unspecific server faults
}
catch(CommunicationException ex)
{
// handle all other, client-proxy related WCF errors
}
catch(Exception ex)
{
// handle anything else....
}