2009-10-13 85 views
1

我正在使用NetTcp绑定与某些WCF服务通信的项目。当第一次开始了我们采取的其他应用程序做WCF通过调用一个不好的做法,比如下面:WCF错误记录

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

直到我们意识到WCF是抱着到即使aspx页面已被发送到连接的工作太棒了客户端(我天真地认为会清理任何连接)。虽然连接被阻止导致事情最终放缓,但ELMAH记录了任何错误并向我们发送了完整的堆栈跟踪。为了解决性能问题,我们改为:

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

这使得表现摇滚比较。这种方法的缺点是每当代理收到错误时,ELMAH唯一可以捕捉到的就是现在的通道出现故障。然后,我们必须深入挖掘日志(使用sharedListener设置WCF的)来判断发生了什么,如果是序列化错误,尽管侦听器在客户端和服务器上都设置了,但实际发现它的可能性要低得多。我已经探索了IErrorHandler接口,并且将为它添加对我们的服务的支持,但是我想知道是否有其他方法可以从WCF中获取详细的错误,而不是仅仅说错误,并且没有真正的信息来说明为什么故障。如果它在序列化它可以告诉我们的对象时死亡,这将是特别有益的。为什么它不能序列化。

回答

1

好了,你可以告诉WCF servive不仅仅是“什么糟糕的事情发生”使用serviceDebug行为发回的更多信息。

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

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

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

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

Marc

+0

我们实际上使用了includeExceptionDetailInFaults标志,并且异常返回到了调试中,但是由于代理服务器出现故障,我们最终看到的是它在没有任何附加信息的情况下发生故障。 try/catch可能是一个选项,但现在改变一切肯定不会很有趣。尽管如此,我仍需要探索一下。 – RubyHaus 2009-10-13 19:39:27