5

我已经[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

4 回答 4

9

拥有 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....
}
于 2010-03-18T22:18:56.607 回答
2

删除它FaultContract,而是配置includeExceptionDetailInFaults

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Behavior">
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
于 2010-03-18T17:27:59.430 回答
0

几分钟前我遇到了同样的问题。这是由于缺少默认构造函数。另请记住,所有属性都必须具有公共 get/set 访问器。

于 2011-02-15T09:15:01.527 回答
0

使用http://msdn.microsoft.com/en-us/library/ms732023.aspx中的服务跟踪查看器工具查看活动跟踪。

于 2010-03-18T17:24:33.373 回答