【问题标题】: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 异常时在循环中阻塞等待。这个解决方案并不优雅。有没有办法让客户端检查主机是否正在侦听而不诉诸异常捕获?

【问题讨论】:

标签: c# wcf named-pipes inter-process-communicat


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2010-12-03
    • 2021-06-09
    • 2023-01-31
    相关资源
    最近更新 更多