我已将属性[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服务引用。
答案 0 :(得分:9)
拥有FaultContracts的目的是使首先从服务中传回SOAP错误成为可能,这不会破坏服务器和客户端之间的通信通道(优雅地和互操作地处理.NET异常等错误条件),第二,使用FaultContracts,您的服务器比抛出类型错误(FaultException<T>
)和您的客户端可以捕获它们。
如果您想要或需要真正实现互操作,您需要:
如果您控制线路的两端并且两端都是.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....
}
答案 1 :(得分:2)
删除FaultContract
,然后配置includeExceptionDetailInFaults
:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="Behavior">
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
答案 2 :(得分:0)
使用http://msdn.microsoft.com/en-us/library/ms732023.aspx中的服务跟踪查看器工具查看活动跟踪。
答案 3 :(得分:0)
几分钟前我遇到了同样的问题。 这是由于缺少默认构造函数。还要记住,所有属性都必须具有公共get / set访问器。