【问题标题】:What might cause a WCF NamedPipe Channel to become faulted (at the server end?)什么可能导致 WCF NamedPipe 通道出现故障(在服务器端?)
【发布时间】: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


    【解决方案1】:

    我会先做一些 WCF 跟踪。

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

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

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

    【讨论】:

    • 嗨尼克,感谢您的建议。 一些大型结果集,应用程序运行的时间越长,它们就越大。 NamedPipeBinding 的最大大小是多少? - 当您提到事件查看器时 - 您是说即使没有跟踪,wcf 也会将内容记录到 Windows syslog 中?他们会出现在哪些 Windows 日志中?
    • 清除有关在 Windows 事件日志中查看位置的问题。 msdn.microsoft.com/en-us/library/ms733738.aspx 有一篇很好的文章解释了 WCF 事件默认的去向
    • 我认为最大大小约为 10MB,但我不建议将其增加到该大小。你会遇到一些性能问题。我还刚刚更新了答案以包含 maxItemsInObjectGraph 配置参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多