0

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

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

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

4

1 回答 1

1

有两种选择。

第一个选项

您可以将“控制台应用程序”连接到 signalR 背板,这些应用程序将能够调用客户端的方法,例如

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

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

缺点:

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

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

第二种选择

您可以实现 Hub 方法,如“PushSomeDataToClients”,并使用@bartbje 评论中提到的SignalR客户端从控制台应用程序调用它。

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

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

第三个选项

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

由于我的原因,我可能会选择第三个选项,因为从架构的角度来看它是干净的。

于 2016-12-08T20:40:11.197 回答