我有一个运行为Azure Web App的网站,该网站配置为使用SignalR和Azure Service Bus scaleout背板。一切运作良好,客户通过/ signalr URL连接,我可以将数据从服务器推送到连接的客户端。
我还有几个控制台应用程序,可以定期运行和输出新数据。我还想将新数据推送到网络连接的客户端。
如何将我的非Web应用程序与SignalR捆绑在一起?我看到的所有示例都假设scaleout集群中的每个服务器都面向Web。是否有一些特殊的设置我需要做的是让外部进程加入SignalR集群,并能够通过SignalR websocket连接将数据推送到网络连接的客户端,而不必同时制作网络应用程序?
答案 0 :(得分:1)
有两种选择。
第一个选项
您可以连接您的"控制台应用"对于signalR背板,这些应用程序将能够使用类似
的方式调用客户端的方法var hub = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hub.Clients.All.doSomething("blah-blah");
您可以将任何端口用于signalR配置,但使用相同的背板配置和相同的集线器。您可以使用Owin进行自托管。没有人会连接到这些控制台应用程序。
缺点:
1)您的控制台应用程序需要引用SignalR.SelfHosting和您的集线器类。从架构的角度来看,这并不好。
2)您的控制台应用程序将侦听某些端口(因为它们是信号服务器)。从理论上讲,有人可以连接到这个集线器并做一些事情。从架构的角度来看,从安全性来看,这并不好。
第二个选项
您可以实现Hub方法,例如&#34; PushSomeDataToClients&#34;并使用@bartbje评论中提到的SignalR 客户端从您的控制台应用中调用它。
优点:第一个选项没有缺点。
缺点:您需要实现一些安全性来防止系统外的任何人调用此方法。 SignalR有很多东西可以做到这一点,所以只是google。例如,您可以为系统间通信创建单独的集线器。
第三个选项
使用另一种方式与SignalR交互Web服务器应用程序。可能你已经在使用像RabbitMq或任何类型的服务总线之类的东西了。您也可以在Web服务器应用程序中使用单独的ApiController实现它。但它似乎更接近第二种选择。
由于我,我可能会选择第三个选项,因为它从架构的角度来看是干净的。