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