什么是将事件发送到所有工作站的最佳方式

时间:2008-12-18 09:00:57

标签: c# wcf web-services tcp udp

我希望有人可以指导我,因为我被卡住了...我需要编写一个紧急广播系统,通知工作站发生紧急情况并在用户屏幕底部弹出一条消息。这似乎很简单,但在多个子网上有大约4000个工作站。系统需要几乎实时,轻量级并且易于部署为Windows服务。

当我发现路由器不转发UDP广播包x.x.x.255时,问题就出现了。后来我在VB6中做了一个简单的测试钩子来捕获网络发送消息,但即便是那些也没有通过路由器。我还写了一个简单的数据包嗅探器来过滤数据包,发现网络数据包从未到达预定目的地。

然后我看了一下并探讨了使用MSMQ over HTTP,但这需要在目标工作站上安装IIS。由于工作站太多,这将是一个重大的安全问题。

现在我已经完成了一个带有异步回调的Web服务,该服务向订阅者发送一个事件。它在小规模上完美运行,但一旦超过15个用户,性能就会大幅下降。轮询服务器实际上不是一个选项,因为它将在服务器上生成负载(另外我也尝试过)

我需要你的帮助来指导我使用什么技术。有没有人用过这么多客户的彗星方式,还是应该看看WCF?

我正在使用Visual C#2005。请帮助我摆脱这种困境。

由于

5 个答案:

答案 0 :(得分:3)

考虑使用WCF回调机制和事件。 Juval Lowy有good introduction

另一种模式是实施blocking web-service calls。例如,这就是GMail聊天的工作方式。但是,您必须在此处理会话和超时。当客户端位于NAT和防火墙后面且无法直接访问时,它可以正常工作。但对于Intranet内的简单警报来说,这可能过于复杂。

答案 1 :(得分:3)

这正是Multicast的设计目标。

正常网络广播(根据定义)保留在本地子网上,不会通过路由器转发。

另一方面,多播传输可以具有各种范围,从子网本地,站点本地,甚至全局。您只需将连接子网的各种路由器组合在一起即可识别组播。

答案 2 :(得分:0)

我认为这个问题最好用socket来解决。

打开与服务器的连接,并将其保持打开状态。

答案 3 :(得分:0)

您是否在每个子网中都有一个从属服务器负责将消息分发给子网中的所有客户端?

然后你可以只有连接到启动消息的中央服务器的从属设备。

答案 4 :(得分:0)

我认为你们中的一些人非常过度思考这个问题。每个版本的Windows都内置了一项服务,可以提供这些功能!它被称为Messenger服务。您所要做的就是确保在所有客户端上启用并运行此服务。

(虽然你没有在问题中指明,但我假设从你的技术选择来看,这个网络的客户端都是Windows)。

您可以使用以下内容从命令行使用此工具发送消息:

NET SEND computername "This is a test message"

NET SEND命令还具有通过Windows域或特定用户按名称发送的选项,无论他们在何处登录,或者连接到特定Windows服务器的每个系统。这些选项可以让您轻松避免子网问题,尤其是在您的网络上使用基于域的安全性时。 (如果您通过服务器而不是直接向客户端发送消息,则可能需要在某些服务器上启用“Alerter”服务。)

这个程序版本是一个名为NetMessageBufferSend()的API,非常简单。对P / Invoke.net的快速扫描发现page for this API不仅提供了调用API所需的定义,还提供了C#示例程序!

您根本不需要编写任何客户端代码。可能涉及最多的事情是找出对此API的最佳调用集,这将完全覆盖您的配置中的网络。

ETA:我刚注意到Messenger服务和此API在Windows Vista中完全消失了。很奇怪微软完全删除这样的功能。对于Vista来说似乎是this vendor has a compatible replacement