WCF错误记录

时间:2009-10-13 16:17:34

标签: wcf error-handling

我正在开发一个使用NetTcp绑定与某些WCF服务进行通信的项目。首次开始时,我们从另一个使用以下内容进行WCF调用的应用程序中获取了一个糟糕的实践示例:

EntityObject sample = new ServiceProxy().GetEntity();

这很有效,直到我们意识到WCF持有连接,即使aspx页面已经发送到客户端(我天真地认为它会清理任何连接)。虽然连接导致事情最终变慢,但ELMAH记录了任何错误并向我们发送了完整的堆栈跟踪。为了解决性能问题,我们改为:

using (ServiceProxy proxy = new ServiceProxy())
{
     sample = proxy.GetEntity();
}

这使得性能相对较高。这种方法的缺点是,只要在代理上收到错误,ELMAH唯一可以捕获的就是信道现在出现故障。然后,我们必须深入研究日志(使用sharedListeners进行WCF设置)以确定发生了什么,如果是序列化错误,尽管在客户端和服务器上都设置了侦听器,但实际发现它的几率要低得多。我已经探索了IErrorHandler接口,并准备为我们的服务添加对它的支持,但我想知道是否还有其他方法可以从WCF中获取详细错误而不是只是说它没有真正的信息,为什么它故障。如果它在序列化对象时死亡,它可以告诉我们为什么它无法序列化,这将特别有益。

2 个答案:

答案 0 :(得分:1)

我认为如果你在代理上显式调用Close(),并将它放在try-catch中,你就会得到你想要的东西。

特别参见这个样本:

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

答案 1 :(得分:1)

好吧,你可以告诉WCF服务使用serviceDebug行为发回更多信息而不仅仅是“发生了一些不好的事情”。

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ExceptionDetails">
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

只要它是开发/测试环境或内部应用程序,这是可以的。但实际上,应该在服务器端捕获(并记录)服务错误 - 您使用IErrorHandler接口在正确的路径上。

客户端需要处理客户端异常,例如TimeoutExceptionCommunicationException来处理安全异常或网络故障等。实际上只是标准的.NET异常处理。

此外,using()通常是一个好主意 - 但不一定在这里,因为在处理ServiceProxy时会遇到异常(在using() {}块的末尾),并且在这种情况下不会被捕获。您可能只需要为服务代理使用try {...} catch {...} finally {...}块。

马克