WCF:如何诊断故障通道?

时间:2010-10-08 16:33:49

标签: wcf debugging diagnostics channelfactory duplex-channel

我正在为我的实验室进行改变运输,希望有助于诊断我们所看到的一些奇怪的通道错误。有一个测试应用程序使用DuplexChannelFactory连接到几个Windows服务,由于某种原因,这个测试应用程序上的通道似乎有很多错误。我计划在那里实现一些重试逻辑,但是弄清楚为什么它们是错误的将是很好的。

我知道频道工厂和代理对象都实现了很多接口,我使用反射器来抓取其中的一些,但我找不到任何类似于我正在寻找的内容。有没有办法在它们出现故障后查询这些对象,以获得有关导致故障的原因的一些信息?

编辑:配置非常基础 - 绑定只是默认构造的NetTcpBinding,服务实现有[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)],服务合同中的任何操作都没有特殊属性。但是,我要求更多关于诊断通道故障的一般技术,而不是诊断这个特定情况。我不希望配置细节对此产生太大影响;如果有的话,配置细节将由所述诊断返回,对吧?

4 个答案:

答案 0 :(得分:4)

Ladislav和Shiraz的答案都很好,我给了他们+1。

我可以添加的是,通常故障通道是服务器上未处理异常的结果。当发生这种情况时,WCF认为服务器存在一些根本性的错误并且使通道出现故障,因此无法使用它。

正确的方法 - 我认为应该是默认的并且是免费的 - 是服务捕获异常并创建FaultException并返回它(看看这个表单示例http://www.c-sharpcorner.com/UploadFile/ankithakur/ExceptionHandlingWCF12282007072617AM/ExceptionHandlingWCF.aspx

WCF没有默认的原因是它更改了合同和WSDL,因此客户端必须获取更新的WSDL。

所以,如果我是你,我会抓住异常,记录它们然后返回一个错误异常,这样我就会知道问题所在并且通道没有出现故障。

答案 1 :(得分:3)

首先是这个测试应用程序,或者是其他客户使用的特定服务。

假设是测试客户端导致问题。可能有两个问题:

  • 未关闭代理,因此达到与服务器的最大连接。
  • 当处理器处于失败状态时不会中止代理。

答案 2 :(得分:2)

您正在寻找的诊断工具称为WCF Tracing。它通常表明频道出现故障的原因。您可以在客户端和服务器上配置它,并使用SvcTraceViewer.exe浏览收集的跟踪。

答案 3 :(得分:0)

你有没有找到ICommunicationObject.OnFauled