2

如果这看起来有点基本,我深表歉意,但我是 WCF 的新手 - 也是一般的进程间通信。

我的设置的详细信息

我在我的 WCF“服务器”中使用 NetNamedPipeBinding,它是作为 Windows 服务运行的应用程序的一部分。

我有两个使用由 DuplexChannelFactory 创建的通道与 WCF 服务器通信的客户端。一个是 ASP.Net MVC 3 Web 应用程序,它为每个页面请求创建一个通道(然后关闭它**)。另一个是 WPF 应用程序(用作服务的一种监视控制台/诊断工具)。

一切都运行良好 - 通常持续一周或更长时间 - 有很多人访问 Web 应用程序,但偶尔会在 WCF“服务器”内部出现问题,并且客户端开始报告异常“通信对象 System.ServiceModel.Channels。 ServiceChannel,不能用于通信,因为它处于故障状态”,每当他们尝试创建通道代理时。

一旦服务器“出现故障”,每次连接尝试都会导致该错误。甚至控制台应用程序的新实例也会报告它。这让我相信这不是“客户端”端的问题。

** 注意:我认为每个页面请求都会关闭频道。它被实例化为 MVC 控制器的成员,据我所知,它超出了范围,并在请求结束时被处理。也许我错了?

问题:

有没有人对在哪里查看有任何建议 - 甚至我如何能够在我的测试环境中重现这个问题。

这种东西能彻底消除吗?或者我应该求助于“服务器”内部的一个线程,它每隔几分钟尝试连接到命名管道服务并在失败时重新启动服务?

附加信息

包含我正在使用的代码(在 WCF“服务器”中)以侦听命名管道上的请求可能会有所帮助

host = new ServiceHost(
    this,
    new Uri[] {
        new Uri("net.pipe://localhost")
    }
);
host.AddServiceEndpoint(
    typeof(IStationDirectory),
    new NetNamedPipeBinding(),
    "StationDirectory"
);

host.Open();

/* Some logging code here */


Thread.Sleep(Timeout.Infinite);

更多问题

假设我正确理解每个 NamedPipe“通道”实际上与 TCP 连接相同(每个客户端/服务器对唯一)。如果我一直看到新客户端出现通道故障错误,那么客户端创建的每个新通道可能从一开始就被破坏了。这是否意味着故障发生在 ServiceHost 内部的某个地方?在这里捕获 host.Faulted 事件会有什么好处吗?

决议更新 (2013)

我知道我问这个问题已经很长时间了 - 但我只是在我的历史中注意到它,我想我应该补充一点,尼克已经一针见血了。我相信这是导致问题的消息有效负载大小。消息中包含一个“报告”对象列表,每个对象都链接到前一个报告。随着时间的推移,这个列表会增长。修剪旧报告并将 WCF 消息保持在或多或少固定的大小可以阻止故障。在过去的几年里,该应用程序一直非常可靠地运行。

4

1 回答 1

2

我会先做一些 WCF 跟踪。

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

如果他们的错误是在您可以看到的任何地方(在事件查看器中)绝对没有记录任何事件,那么它可能是

  1. 消息负载对于您的绑定来说太大了。如果您要返回大型结果集,而且是断断续续的,我会从这里开始。还要检查您的 maxItemsInObjectGraph 绑定配置。
  2. 服务启动时出现未处理的异常。这似乎不是你的问题。
于 2011-09-16T15:44:25.000 回答