如何处理低级WCF错误?

Syl*_*ain 7 wcf

我的服务中存在标准错误:

  • 我有一个IErrorHandler挂钩到服务,以处理服务执行期间的意外错误.
  • 我在所有服务方法中尝试/捕获块来处理预期的情况.

但是,有些情况下会在服务器上抛出异常而不会调用异常.

以下是未将服务器异常发送到IErrorHandler的情况:

  • 将服务器绑定上的receiveTimout设置为5秒.

  • 在客户端上执行此操作:

.

Service1Client sc = new Service1Client();
ICommunicationObject o = sc as ICommunicationObject;

o.Open(); // open channel

sc.GetData(10); // do a first call

Thread.Sleep(10000); // wait longer than the server receiveTimeout

sc.GetData(10); // Attempt another call: server throws a FaulException
Run Code Online (Sandbox Code Playgroud)

在这种情况下,错误被抛出在服务器上,但我找不到处理它的方法(并记录它).我知道会出现错误,因为如果我在服务器进程上附加调试器并中断所有异常,则调试器会中断.

我发现其他类似的情况,低级错误没有传递给我的程序.

我在哪里可以挂钩我的代码以确保我可以处理服务器上返回到客户端应用程序之前发生的所有异常?我应该实现自己的IChannel还是其他一些低级接口?

谢谢

更新2009年9月21日:在Microsoft WCF论坛上查看主题.如果我想处理这种类型的异常,我可能必须实现自己的Channel.当我有更多信息时,我会再次更新这篇文章.

Syl*_*ain 5

经过大量的研究和实验,答案是:

此时(.Net 3.5),没有机制允许人们处理在WCF调用的上下文中可能发生的所有可能的异常.

在服务方法执行期间发生的异常可以通过以下方式轻松处理:

  1. 在所有服务方法中尝试/捕获块以处理预期的情况.
  2. IErrorHandler挂钩服务以处理服务执行期间的意外错误.

但是,对于低级别WCF基础结构错误,没有完美的解决方案.存在的最佳解决方案似乎是实现自定义渠道以捕获更多异常.

此Microsoft Connect Bug报告中,Microsoft确认无法处理所有类型的WCF基础结构错误.

Microsoft WCF论坛的这个主题中,有一个关于如何实现自定义通道的示例.该解决方案仅适用于HTTP,不适用于HTTPS.此外,自定义通道也未捕获某些WCF基础结构错误(请参阅该特定线程中的更多详细信息).