客户端未调用 WCF 故障事件

WCF faulted event not called on client side

我有一个 wcf 服务回调。服务的初始化在客户端完成。服务时不时地进入故障状态。我尝试在客户端和服务器上注册故障事件。问题是只有服务器端故障事件正在触发,而客户端不知道出了什么问题,并且由于客户端创建了连接,所以服务器端知道它并没有帮助我。 我可以在服务器端故障事件上做些什么来告诉客户端出了点问题吗?

根据您的担忧问题是只有服务器端故障事件正在触发,而客户端不知道

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

客户不知道出了问题

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

我可以在服务器端故障事件上做些什么来告诉客户端出了问题吗? 您可以 include/append 排除 SOAP 错误。 代码中任何地方发生异常,将其标记为 soap 错误。

例如,您试图抛出除零之类的异常,捕获它并将其包含在 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 的形式传送到客户端 message.And 在客户端捕获它。

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

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