Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF:FaultContract(typeof(ExceptionDetail除外))问题_Wcf_Faultcontract - Fatal编程技术网

WCF:FaultContract(typeof(ExceptionDetail除外))问题

WCF:FaultContract(typeof(ExceptionDetail除外))问题,wcf,faultcontract,Wcf,Faultcontract,我已将属性[FaultContract(typeof(exceptiondeail))]放入我的操作合同中。尝试将服务添加到客户端应用程序时,出现以下错误-“自定义工具错误:无法为服务引用“ServiceReference1”生成代码。有关详细信息,请查看其他错误和警告消息。” 但是,当我注释掉FaultContract属性时,我可以将wcf服务引用添加到我的客户端应用程序中。从中使用服务跟踪查看器工具来查看活动跟踪。删除该FaultContract,而是配置includeExceptionDe

我已将属性
[FaultContract(typeof(exceptiondeail))]
放入我的操作合同中。尝试将服务添加到客户端应用程序时,出现以下错误-
“自定义工具错误:无法为服务引用“ServiceReference1”生成代码。有关详细信息,请查看其他错误和警告消息。”


但是,当我注释掉FaultContract属性时,我可以将wcf服务引用添加到我的客户端应用程序中。

从中使用服务跟踪查看器工具来查看活动跟踪。

删除该
FaultContract
,而是配置
includeExceptionDetailInFaults

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Behavior">
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

拥有FaultContract的意义在于,首先可以从服务传回SOAP故障,这不会中断服务器和客户端之间的通信通道(以优雅和互操作的方式处理.NET异常等错误情况),其次,使用FaultContract,您的服务器不会抛出类型错误(
FaultException
),您的客户端可以捕获这些错误

如果您想要或需要真正的互操作性,您需要:

  • 将所有FaultContract类型定义为用[DataContract]属性修饰的类
  • 捕获服务器上的所有.NET异常(使用例如IErrorHandler接口),并将它们转换为可互操作的SOAP故障
如果您控制线路的两端,并且两端都是.NET,那么您可以通过一个步骤来简化这一过程:在服务器上,处理所有.NET异常,并将它们转换为例如
FaultException
,即创建一个“fault of(whatever.NET exception)”,然后在客户端上,捕获这些类型的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....
}
试试看
{
clientProxy.CallService();
}
捕获(FaultException-ex)
{
//首先处理最具体的异常
}
捕获(FaultException-ex)
{
//处理所有其他非特定的服务器故障
}
捕获(通信例外)
{
//处理所有其他与客户端代理相关的WCF错误
}
捕获(例外情况除外)
{
//处理其他事情。。。。
}

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

@jitus:在这种情况下,您不需要列出该异常。根据,建议只用于调试。我说不出为什么。