WCF:FaultContract(typeof(ExceptionDetail))问题

时间:2010-03-18 14:35:36

标签: wcf faultcontract

我已将属性[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服务引用。

4 个答案:

答案 0 :(得分:9)

拥有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....
}

答案 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访问器。

相关问题