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

时间:2009-05-19 09:19:05

标签: c# wcf net.tcp

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

5 个答案:

答案 0 :(得分:24)

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

还有一位Microsoft员工执行的实施: WS-Discovery Sample Implementation

.NET 4.0将原生包含此内容。您可以在Jesus Rodriguez的博客上阅读有关.NET 4.0的实现。它有一个很好的图表,详细介绍了WS-Disco Using WS-Discovery in WCF 4.0

中的ad-hoc通信

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

希望这有帮助。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

我认为不可能向客户端发送服务器端呼叫通知他您已启动服务...我能看到的最佳方法是使用客户端方法确定服务是否打开并且状况良好。除非我遗漏了WCF的一些功能......

如果您对阅读感兴趣,可以使用一篇好文章WCF: Availability of the WCF services

答案 3 :(得分:1)

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

答案 4 :(得分:1)

这就是我正在使用的东西,它就像一个魅力。顺便说一下,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();
}