16

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

4

5 回答 5

24

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

还有一个微软员工完成的实现: WS-Discovery Sample Implementation

.NET 4.0 将本机包含此内容。您可以在 Jesus Rodriguez 的博客上了解 .NET 4.0 的实现。它有一个很棒的图表,详细说明了在 WCF 4.0 中使用 WS-Discovery 在WS-Disco 中进行的临时通信

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

希望这可以帮助。

于 2009-05-19T16:25:31.233 回答
3

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

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

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

于 2009-05-19T09:36:46.307 回答
1

我认为不可能对您的客户进行服务器端调用以通知他您的服务已启动...我能看到的最佳方法是让客户端方法确定服务在哪里打开并且良好健康)状况。除非我缺少 WCF 的某些功能......

有一篇很好的博客文章WCF:WCF 服务的可用性,如果您有兴趣阅读。

于 2009-05-19T09:22:31.907 回答
1

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

于 2009-05-19T10:00:22.000 回答
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();
}
于 2014-03-11T22:02:55.233 回答