如何确定WCF服务已准备好?

Jas*_*ter 11 c# wcf

我有以下场景:

我的主应用程序(APP1)启动一个进程(SERVER1).SERVER1通过命名管道承载WCF服务.我想连接到这个服务(从APP1),但有时它还没有准备好.

我创建了ChannelFactory,打开它并让它生成一个客户端.如果我现在在生成的客户端上调用一个方法,我会收到一个excpetion whitch告诉我没有找到Enpoint:

var factory = new ChannelFactory<T>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe//localhost/myservice");
factory.Open()

var Client = factory.CreateChannel();
Client.Foo();
Run Code Online (Sandbox Code Playgroud)

如果我在拨打电话前等一下,一切都很好;

var Client = factory.CreateChannel();
Thread.Sleep(2000);
Client.Foo();
Run Code Online (Sandbox Code Playgroud)

如何确保服务准备就绪而无需等待一段随机时间?

Rob*_*ine 6

如果一般情况是您只是在等待其他服务启动,那么您也可以使用在您的界面上执行"Ping"方法的方法,该方法不执行任何操作,并在重新开始响应之前重试.

我们做了类似的事情:我们在启动时尝试在循环中调用ping方法(重试之间1秒),在我们的日志中记录(但最终忽略)TargetInvocationException尝试到达我们服务的任何事件.一旦我们得到第一个正确的答案,我们继续前进.

当然,这只涵盖启动预热案例 - 服务可能在成功ping之后停止,或者我们可以获得TargetInvocationException除"服务未准备好"之外的其他原因.

  • 他们没有"未能掩盖"这种情况; "准备就绪"是一种由你来定义的行为. (2认同)

Chr*_*son 5

一旦服务主机完全打开并且通道监听器的Opened事件被触发,您可以使服务信号成为事件[编辑 - 参见注释].应用程序将在使用其代理之前等待事件.


注意:使用命名事件很简单,因为.NET类型EventWaitHandle为您提供了所需的一切.使用匿名事件是可取的,但需要更多工作,因为.NET事件包装器类型不会为您提供可继承的事件句柄.但是,如果您自己P/Invoke Windows DuplicateHandleAPI以获取可继承的句柄,然后将重复的句柄值传递给其命令行参数中的子进程,则仍然可以.