我有以下场景:
我的主应用程序 (APP1) 启动了一个进程 (SERVER1)。 SERVER1 通过命名管道托管 WCF 服务。我想连接到这个服务(来自 APP1),但有时它还没有准备好。
我创建了 ChannelFactory,打开它并让它生成一个客户端。如果我现在在生成的客户端上调用一个方法,我会收到一条异常消息,告诉我找不到 Enpoint:
var factory = new ChannelFactory<T>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe//localhost/myservice");
factory.Open()
var Client = factory.CreateChannel();
Client.Foo();
如果我在调用服务之前稍等片刻,一切都很好;
var Client = factory.CreateChannel();
Thread.Sleep(2000);
Client.Foo();
我如何确保服务准备就绪而无需等待随机时间?
最佳答案
如果一般情况是您只是在等待其他服务启动,那么您也可以使用在您的界面上设置一个什么都不做的“Ping”方法,然后重试直到它开始响应。
我们做了类似的事情:我们尝试在启动时循环调用 ping 方法(重试间隔 1 秒),在我们的日志中记录(但最终忽略)任何发生的 TargetInvocationException
尝试到达我们的服务。一旦我们得到第一个正确的回应,我们就继续前进。
当然,这只涵盖了启动预热情况 - 服务可能会在成功 ping 后关闭,或者我们可能会因为“服务未准备好”以外的原因得到 TargetInvocationException
。
关于c# - 如何确定 WCF 服务已准备就绪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5391893/