客户端检查命名管道主机是不是打开

Posted

技术标签:

【中文标题】客户端检查命名管道主机是不是打开【英文标题】:Client checking if named pipe host is open客户端检查命名管道主机是否打开 【发布时间】:2014-11-27 17:37:48 【问题描述】:

我在同一台机器上有一个自托管的 WCF 服务主机和客户端。我在这里使用 WCF 进行进程间通信。我可以打开主机并让客户端在一段时间后连接到它,如下所示:

ServiceHost host = new ServiceHost(typeof(AIEngineLoader));

string hostAddress = string.Format("net.pipe://localhost/AIEngine/" + name);
var endPointBinding = new NetNamedPipeBinding();
endPointBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
endPointBinding.ReceiveTimeout = TimeSpan.MaxValue;
host.AddServiceEndpoint(typeof(IAIEngineLoader), endPointBinding, hostAddress);            

host.Open();

主机在另一个控制台应用程序中运行。在启动控制台进程后等待一段时间(现在三秒),客户端能够连接到该主机。我不想等待预先指定的时间然后连接到主机。一种方法是在客户端捕获 CreateChannel 异常时在循环中阻塞等待。这个解决方案并不优雅。有没有办法让客户端检查主机是否正在侦听而不诉诸异常捕获?

【问题讨论】:

Check if WCF(namedpipes) host is available?的可能重复 @fejesjoco 您提到的链接提供了一个似乎过于复杂的解决方案。我还没有准备好将我的代码复杂到那种程度以进行简单的检查。我更喜欢循环检查。 在这种情况下:***.com/questions/8571093/… 【参考方案1】:

WCF 不会简单地告诉您是否有人在监听该管道地址。管道的实际名称是obfuscated,只能尝试连接并捕获异常。您可以使用named global mutex 将WCF 排除在外,这是原始的进程间通信。但是,带有管道的 WCF 本身就是 IPC,因此我不会将互斥锁的问题复杂化。这就像发送一封邮政邮件和一个 FedEx 包裹,让对方知道包裹正在运送中。

【讨论】:

以上是关于客户端检查命名管道主机是不是打开的主要内容,如果未能解决你的问题,请参考以下文章

通过命名管道访问单例会创建第二个单例。未在主机端触发的事件

以低完整性级别打开命名管道

如何在 WCF 中自动重新连接命名管道绑定

命名管道 232 管道正在关闭

未找到 WCF 命名管道端点

Linux 中的 Windows 命名管道替代方案