【发布时间】:2011-11-18 19:32:41
【问题描述】:
如果这看起来有点基本,我深表歉意,但我是 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 消息保持在或多或少固定的大小可以阻止故障。该应用程序在过去几年中一直非常可靠地运行。
【问题讨论】:
标签: .net asp.net wcf asp.net-mvc-3 netnamedpipebinding