我已经把属性[FaultContract(typeof(ExceptionDetail))]
为我的运营合同。当我尝试将服务添加到客户端应用程序时,出现此错误 -"Custom tool error: Failed to generate code for the service reference 'ServiceReference1'. Please check other error and warning messages for details."
但是当我注释掉FaultContract 属性时,我可以在我的客户端应用程序中添加wcf 服务引用。
拥有FaultContracts的目的是首先能够从服务传回SOAP错误,这不会破坏服务器和客户端之间的通信通道(优雅且可互操作地处理.NET异常等错误条件),其次,使用FaultContracts,您的服务器将抛出类型错误(FaultException<T>
)并且您的客户可以捕捉到这些。
如果您想要或需要真正的互操作性,您需要:
- 将所有的FaultContract类型定义为用[DataContract]属性修饰的类
- 捕获服务器上的所有 .NET 异常(使用例如 IErrorHandler 接口)并将它们转换为可互操作的 SOAP 错误
如果您控制线路的两端并且两端都是 .NET,那么您可以简化这一步骤:在服务器上,处理所有 .NET 异常并将它们转换为例如FaultException<ArgumentOutOfRangeException>
,也就是说,创建一个“故障(无论 .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....
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)