代码之家  ›  专栏  ›  技术社区  ›  Sylvain

如何处理低级WCF错误?

wcf
  •  7
  • Sylvain  · 技术社区  · 15 年前

    在我的服务中,我有标准的错误处理:

    • 我有一个连接到服务的IErrorHandler来处理服务执行过程中的意外错误。
    • 我在所有的服务方法中都使用了try/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日更新 this Microsoft WCF论坛上的线程。如果我想处理这种类型的异常,我可能需要实现自己的通道。当我有更多信息时,我会再次更新这篇文章。

    4 回复  |  直到 14 年前
        1
  •  5
  •   Sylvain    14 年前

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

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

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

    1. 在所有服务方法中尝试/catch块来处理预期的情况。
    2. IErrorHandler挂接到服务以处理服务执行过程中的意外错误。

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

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

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

        2
  •  2
  •   Larry Watanabe    15 年前

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

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

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

    这对于调试也更好,因为通常您会开发一个客户机,并且不希望为了调试而关闭服务器。

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

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

        3
  •  0
  •   marc_s Hady Salah    15 年前

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

    因此,在这些情况下,在服务器上使用IErrorHandler确实没有帮助,因为错误确实发生在客户机上(不能建立连接,因为网络断开,或者服务器地址或sstuff中的拼写错误)。

    所以在客户机方面,您肯定还必须使用try….捕获所有服务器调用。

    马克

        4
  •  0
  •   Artem Koshelev    15 年前

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