如何通过 SignalR websockets 从控制台程序推送数据?

How do I push data from a console program over SignalR websockets?

我有一个网站 运行ning 作为 Azure Web 应用程序,配置为使用 SignalR 和 Azure 服务总线横向扩展底板。一切正常,客户端通过 /signalr URL 连接,我可以将数据从服务器推送到连接的客户端。

我还有几个控制台应用程序,它们会定期 运行 并输出新数据。我也想将新数据推送到网络连接的客户端。

如何将我的非 Web 应用程序与 SignalR 结合起来?我看到的所有示例都假设横向扩展集群中的每台服务器都面向 Web。我是否需要做一些特殊设置才能让外部进程加入 SignalR 集群并能够通过 SignalR websocket 连接将数据推送到连接到 web 的客户端,而不必同时制作它们的 web 应用程序?

有两种选择。

第一个选项

您可以将 "console apps" 连接到 signalR 背板,这些应用程序将能够调用客户端的方法,例如

var hub = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hub.Clients.All.doSomething("blah-blah");

您可以将任何端口用于 signalR 配置,但要使用相同的背板配置和相同的集线器。您可以使用 Owin 进行自我托管。没有人会连接到这些控制台应用程序。

缺点:

1) 您的控制台应用程序需要引用 SignalR.SelfHosting 和您的集线器 类。从架构的角度来看,这并不好。

2) 您的控制台应用程序将监听一些端口(因为它们是 signalR 服务器)。理论上,有人可以连接到这个集线器并做一些事情。从架构的角度和安全的角度来看,这都不好。

第二个选项

您可以像 "PushSomeDataToClients" 一样实现 Hub 方法,并使用 SignalR client 从您的控制台应用程序调用它,如 @bartbje 评论中所述。

优点:第一个选项没有缺点。

缺点:您需要实施一些安全措施以防止系统外的任何人调用此方法。 SignalR 有很多东西可以做到这一点,所以只是 google。例如,您可以为系统间通信创建单独的集线器。

第三个选项

使用 SignalR 之外的另一种方式与 Web 服务器应用程序交互。可能您已经在使用诸如 rabbitMq 或任何类型的服务总线之类的东西。您也可以在您的网络服务器应用程序中使用单独的 ApiController 来实现它。但它似乎更接近第二种选择。

对我来说,我可能会选择第三个选项,因为从架构的角度来看它很干净。