如何处理低级WCF错误?

时间:2009-08-13 13:15:30

标签: wcf

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

  • 我有一个IErrorHandler挂钩到服务来处理服务执行期间的意外错误。
  • 我在所有服务方法中尝试使用/ catch块来处理预期的情况。

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

以下是未将服务器异常发送到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

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

我发现其他类似的情况,其中低级错误未传递给我的程序。

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

由于

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

4 个答案:

答案 0 :(得分:5)

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

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

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

  1. 在所有服务方法中尝试/捕获块以处理预期的情况。
  2. IErrorHandler挂钩服务以处理服务执行期间的意外错误。
  3. 但是,对于低级别WCF基础架构错误,没有完美的解决方案。存在的最佳解决方案似乎是实现自定义渠道以捕获更多异常。

    this Microsoft Connect Bug Report中,Microsoft确认无法处理所有类型的WCF基础结构错误。

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

答案 1 :(得分:2)

使用FaultContracts。然后可以在客户端处理故障。

http://msdn.microsoft.com/en-us/library/ms732013.aspx

http://www.c-sharpcorner.com/UploadFile/ankithakur/ExceptionHandlingWCF12282007072617AM/ExceptionHandlingWCF.aspx

这对于调试来说也好得多,因为通常您将开发一个客户端,并且不希望关闭服务器以进行调试。

在客户端,使用try / catch块来捕获所有异常/错误。肯定存在服务器端无法检测到的错误,例如通信问题,因此无论如何都需要在客户端处理错误。

如果您想要集中式错误处理,您可以创建一个服务,该服务接收有关所有错误的消息,将错误发送到该服务器,并让它记录该错误。如果要创建集中式消息跟踪/性能分析/日志记录工具并拥有大量应用程序处理器,服务器,客户端等,这将非常有用。

答案 2 :(得分:0)

重点是 - 如果服务器无法访问或无法处理消息,则服务器上不会出现错误 - 客户端会弹出错误(“TimeoutException”或其他错误)。

所以在这些情况下,在服务器上安装IErrorHandler确实无法提供帮助 - 因为错误确实发生在客户端上(由于网络故障,服务器地址或类似服务器中的错误,无法建立连接) )。

所以在客户端,你肯定也必须使用try .... catch你的所有服务器调用。

马克

答案 3 :(得分:0)

设置诊断跟踪并使用Service Trace Viewer Tool检查日志。链接还包含有关配置跟踪的信息。