wcf - 捕获通信异常而不是自定义故障异常 - WCF

标签 wcf exception

在服务器上我抛出这样的异常。

catch(SqlException exception)
{
  if (exception.Message.Contains("Custom error from stored proc"))
  {
    //Exception to be thrown when authentication fails.
    throw new FaultException<MyServiceFault>(new MyServiceFault { MessageText = exception.Message });
  }
}

在客户端我捕获了异常

catch(FaultException<MyServiceFault> faultException)
{

}

这是我的 MyServiceFault

[DataContract]
public class MyServiceFault  
{
  [DataMember]
  public string MessageText { get; set; }

  [DataMember]
  public Guid Id { get; set; }
}

问题是在客户端上,它不会进入 MyServiceFault catch block ,而是进入通信异常 catch block 并抛出此错误

System.ServiceModel.CommunicationException: The underlying connection was closed: The connection was closed unexpectedly. ---> System.Net.WebException

我还装饰了我的服务方法[FaultContract(typeof(MyServiceFault))]在我的服务实现的接口(interface)中。

在我的 web.config servicebehaviour 标签中包含 <serviceDebug includeExceptionDetailInFaults="true" />

知道我哪里出错了。

此问题发生在 Windows 7 上。是否有相关原因?

重要更新
根据回答者的说法,服务器上任何未处理的异常都可能导致客户端抛出通信异常,并且它可能与您在服务器上抛出的自定义错误异常无关。因此,解决方案是在服务器上记录错误并查找导致此行为的错误。这是我发现并实现的一个非常有用的开源日志记录功能,在您的项目进入生产环境后它甚至会更有用。非常感谢各位的回答。

A better way of logging exceptions in WCF

最佳答案

通过将其包含在您的 app.config 中,将日志记录添加到您的 WCF 调用中。

<system.diagnostics>
  <trace autoflush="true" />
  <sources>
    <source name="System.ServiceModel" switchValue="Information, ActivityTracing">
      <listeners>
        <add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\LogPath\LogFile.svclog" />
      </listeners>
    </source>
  </sources>
</system.diagnostics>

(您可以对服务器和客户端执行此操作,显然指定不同的日志文件)

生成一些日志后,请查看异常或警告。我经常发现这会产生一些非常有用的信息,帮助我解决 WCF 问题。

要读取日志文件,您需要使用 SvcTraceViewer.exe 。不幸的是,获得此信息的唯一方法是使用 the windows SDK对于一个很小的工具来说,这是一个很大的下载。

还值得记住的是,WCF 在关闭时可以通过 CommunctionException,这是预期的行为。您不应该仅仅对客户端 WCF 通信 channel 进行using。相反,您应该遵循这样的模式:

try{
    x.Close()
}
catch(Comms ex){
    x.Abort()
}

关于wcf - 捕获通信异常而不是自定义故障异常 - WCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2712205/

相关文章:

c# - WCF 消耗多个可能的 REST 响应

C++异常重载构造函数

Java异常处理?

android - 完成 Activity 时出现 MediaPlayer 异常

c# - 我应该为 "No Record Found"使用哪种异常? (C#)

c# - WCF-C#服务应连续发送结果

c# - 无法加载文件或程序集 'Microsoft.Expression.Encoder'

c# - 如何根据参数更改 wcf 响应类型?

asp.net - 从普通的 .aspx 页面启动 ASP MVC 项目

c++ - 在 C++ 中捕获段错误或任何其他错误/异常/信号,就像在 Java 中捕获异常一样