如何将多个客户端连接到多个服务器并根据特定事件从服务器发送警报?

时间:2015-11-16 19:01:43

标签: c# .net winforms wcf windows-services

背景

我目前有多台服务器远程连接以运行许多不同的命令/脚本,以获取有关服务器上运行的服务器和/或应用程序的信息。

我想自动运行命令/脚本(或转换为C#/ .NET的脚本中包含的代码)并让服务器向客户端发送警报/通知/消息(基本上是Windows窗体)在多个工作站上运行,但需要一些指导。

作为参考,我在创建Windows服务方面经验有限,但对能够在服务器上创建它们来处理命令/脚本自动化感到相当自信,我认为这是最好的方法。处理服务器上的命令/脚本自动化(因为命令/脚本需要一直运行或以设定的间隔运行)。

问题

如何将多个服务器连接到多个客户端,以便服务器在命令/脚本甚至事件发生时向客户端发送警报/通知/消息?

例如,如果服务器上的应用程序有一个内置命令可以运行以确定应用程序的状态(up,down,limbo等),我希望客户端上的Windows窗体能够当命令返回时,从服务器接收警报" down"或者" limbo"当它运行时,可能来自Windows服务。警报将显示在Windows窗体上,该窗体基本上将设置为客户端可以连接到的服务器的仪表板。

更好的结果是客户端作为后台应用程序运行,并且显示的通知类似于Microsoft Outlook在新电子邮件到达时显示通知的方式(尽管这些通知可能需要用户交互关闭而不是像Outlook通知)。

我还希望客户端使用包含服务器连接信息的配置文件,以便快速更改正在使用的服务器,添加新服务器或停用现有服务器。

研究(到目前为止)

我已经了解了WCF和双工合同,以及如何在Windows服务中托管WCF。从我所读到的,这看起来很有希望。但是,我不太确定如何设置它以便客户端可以连接到多个服务器上的WCF服务。

我关注WCF的一件事是,在所有WCF示例(实现计算器类型服务)中,我已经看到客户端必须按顺序启动与服务器的通信通过回调接收消息。在计算器服务示例中,客户端向服务发送号码,结果在回调中提供。我还看到了一个异步示例,但在该示例中,客户端发起了一个长时间运行的请求,并且回调在完成处理时返回了一个响应。

而且,为了清楚WCF中的绑定,可以使用配置文件为多个服务器创建和使用绑定,而无需使用SvcUtil.exe生成代码,对吗?我问的原因是因为将要配置的服务器可能会针对不同的用户进行更改,因此客户端在连接服务时需要灵活。

我刚刚开始关注套接字,但我对他们不熟悉,知道这是否是实现我的目标的更好选择。

摘要

我只是在寻找指导,所以如果你能帮助我找到一些能帮助我实现目标的资源,我将不胜感激。我进行了广泛的搜索,但我的大多数搜索要么不适用于我的场景,它只限于单个服务器/客户端交互,或者仅限于具有多个客户端的单个服务器。

由于我不确定要采用的方向,因此我没有任何代码示例,但我已在以下Microsoft文章中实现了这些示例:Windows Communication Foundation - Getting Started Tutorial

1 个答案:

答案 0 :(得分:1)

所以你想构建一个

系统
  1. 在其运行的计算机上执行命令的多个服务器
  2. 多个客户端将接收服务器上执行的命令的状态或来自服务器的此类信息
  3. 这是我的建议

    1. 服务器可以实现为Windows服务。您可以使用服务控制台或scm以这种方式轻松管理它们。查看此链接以创建简单的C#服务How do you write and use a Windows Service in C#?
      此外,除常规用户帐户外,您还可以将服务设置为以in-built service user运行,并具有不同级别的权限。
    2. 我没有使用过WCF,但通常客户端连接到服务器;这是一个非常常见的模型,因此所有样本都是这样的。从服务器启动连接并不是什么大问题(至少在套接字程序中),但只是一个糟糕的模型。您必须问自己,如果没有客户端连接到您的服务器,他们如何将状态转发给最终用户。你必须清楚地思考沟通模式。我会建议一个中央的消息库。它可以是共享文件系统或数据库上的文件,也可以是充当数据存储库的任何此类实体。这样,如果客户端连接与否,所有服务器都可以传达消息而无需关心。您可以使用套接字来实现您想要的功能。查看asychronous socket server sample from MSDN以了解操作方法。
    3. 让客户端在后台运行,只需要一个通知区域图标在c#中也很容易。您可以使用NotifyIcon ClassThis CodeProject article (Formless System Tray Application)演示了它的用法。要显示la outlook样式的通知,您可以参考以下帖子:How to create form popup from from system tray on windows application (not web) with c#。不仅要看接受的答案,还要看其他答案;其中有很多有用的链接。
    4. 到目前为止,我们已经通过套接字讨论Windows服务,将消息存储在中央存储库中,并且能够处理具有用于客户端通知的吐司风格弹出窗口的多个客户端。

      您需要更丰富的客户端GUI,以便最终用户可以对从服务器发送的消息采取措施。您可以在app.config中维护客户端在启动时连接的客户端列表。您应该为用户提供GUI来管理所有服务器及其连接。

      Lat但并非最不重要的是,通过构建这样的客户端服务器模型,您有效地在系统中构建了一个安全漏洞。您应该实施一个良好的授权机制。查看以下帖子:Authenticate user in WinForms (Nothing to do with ASP.Net)

      编辑: 您还可以实现服务器以接受"自定义命令"当您将其实现为服务时。这样,您的客户端服务器通信将通过使用ServiceController传递命令来标准化。这篇文章可能有所帮助:How to send a custom command to a .NET windows Service from .NET code? 不要在"命令"中感到困惑。术语在这里。 ServiceController向服务发出标准命令,以启动,停止,暂停,恢复和重新启动服务。这些是您在services.msc管理单元中右键单击服务时在上下文菜单中看到的相同项目。服务可以响应自定义命令的方式相同。在您的情况下,自定义命令可能是执行进程的请求 请注意,我所描述的某些机制适用于Intranet设置,而其他机制则适用于Intranet和Internet