如果这看起来有点基本,我深表歉意,但我是 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 消息保持在或多或少固定的大小可以阻止故障。在过去的几年里,该应用程序一直非常可靠地运行。