客户端未调用WCF故障事件

时间:2018-01-19 13:11:55

标签: wcf wcf-binding

我有一个wcf服务回调。服务的初始化在客户端完成。服务偶尔会进入故障状态。我尝试在客户端和服务器上注册故障事件。问题是只有服务器端故障事件被触发,客户端不知道出了什么问题,并且由于客户端创建了连接,因此服务器端无法知道它。 有什么我可以在服务器端故障事件,以告诉客户端出现问题?

1 个答案:

答案 0 :(得分:0)

根据您的关注问题是只有服务器端出现故障的事件正在触发且客户端不知道

当WCF服务发生异常时,该服务将异常序列化为SOAP错误,然后将SOAP错误发送给客户端。

客户不知道出了什么问题

默认情况下,出于安全原因传播到客户端应用程序的SOAP错误中不包含未处理的异常详细信息。而是将一般的SOAP错误返回给客户端。

我是否可以在服务器端发生故障事件,告诉客户端出现问题? 您可以在SOAP错误中包含/附加异常。 代码中发生任何异常,将其标记为soap fault。

例如,您尝试抛出异常,例如除以零,捕获它并将其包含在FaultException中。

throw new FaultException("Denomintor cannot be ZERO", new FaultCode("DivideByZeroFault"));

如果要在SOAP错误中包含异常详细信息,请启用 IncludeExceptionDetailInFaults 设置。

通过配置

<behaviors>
  <serviceBehaviors>
    <behavior name="inculdeExceptionDetails">
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

如果需要,可以通过代码

[ServiceBehavior(IncludeExceptionDetailInFaults=true)]

通过这种方式,服务器端发生的任何异常都以SOAP消息包络内的SOAP FAULT的形式传送到客户端。并在客户端捕获它。

catch (FaultException ex)
{
string errorMessage= = ex.Message;
}

注意: WCF服务中的未处理异常将导致通信通道出现故障,并且会话将丢失。一旦通信通道处于故障状态,我们就不能再使用相同的代理类实例。我们必须创建代理类的新实例。