如何检查net.tcp WCF服务的可用性

我的WCF服务器需要定期上下移动,客户端有时会使用服务器,但如果它关闭,客户端就会忽略它。 因此,每次我需要使用服务器服务时,我都会检查连接状态,如果它没有打开,我打开它。 问题是,如果我在服务器关闭时尝试打开,则会出现性能下降的延迟。 我的问题是,有没有办法做某种myClient.CanOpen() ? 所以我知道是否有任何意义打开与服务器的连接。

有一个WS-Discovery实现,允许您监听服务的上/下通知。 这也是一种非常方便的服务地址解析forms,因为它利用UDP多播消息来查找服务,而不是在客户端上配置一个设置地址。 WCF的WS-Discovery

还有一个由Microsoft员工完成的实现: WS-Discovery示例实现

.NET 4.0将包含本机。 您可以在Jesus Rodriguez的博客上阅读有关.NET 4.0的实现。 它有一个很好的图表,详细说明了在WCF 4.0中使用WS-Discovery的 WS-Disco中进行的ad-hoc通信

您可能会考虑的另一件事,特别是如果您的消息主要是单向的,是一个本机断开连接的协议,如MSMQ。 我不知道您的应用程序的设计是什么样的,但MSMQ将允许客户端发送消息而不管服务的状态如何,服务将在重新启动时获得它。 通过这种方式,您的客户端不必非常阻止尝试在通信之前确认服务已启动…它只会触发并忘记。

希望这可以帮助。

如果您正在进行同步调用,期望在具有用户界面的应用程序中服务器超时,则应该在另一个线程中执行此操作。 我怀疑性能损失是由于exception开销造成的。 CPU负载,gui可用性或挂钟时间是否会降低性能?

您可以调查以查看是否可以在TCP上创建自定义绑定,但具有更快的超时。

我假设您知道“IsOneWay = true”比您的情况下的请求 – >响应更快,因为您无论如何都不会期待响应,但是您没有得到确认或返回值。 您还可以实现不是请求 – >响应的双向通信。

如果您在本地网络中,则可能会广播一个信号,表示新服务器已启动。 客户端需要监听广播信号并做出相应的响应。

这就是我正在使用的东西,它就像一个魅力。 顺便说一句,ServiceController类存在于命名空间’System.ServiceProcess’中。

 try { ServiceController sc = new ServiceController("Service Name", "Computer's IP Address"); Console.WriteLine("The service status is currently set to {0}", sc.Status.ToString()); if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) || (sc.Status.Equals(ServiceControllerStatus.StopPending))) { Console.WriteLine("Service is Stopped, Ending the application..."); Console.Read(); EndApplication(); } else { Console.WriteLine("Service is Started..."); } } catch (Exception) { Console.WriteLine("Error Occurred trying to access the Server service..."); Console.Read(); EndApplication(); } 

我不认为可以向客户端发出服务器端呼叫通知他您已启动该服务…我能看到的最佳方法是使用客户端方法确定服务何处开放且良好条件。 除非我遗漏了WCF的一些function……

有一个很好的博客文章WCF:如果您对阅读感兴趣,可以使用WCF服务 。