客户端检查命名管道主机是不是打开
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 包裹,让对方知道包裹正在运送中。
【讨论】:
以上是关于客户端检查命名管道主机是不是打开的主要内容,如果未能解决你的问题,请参考以下文章