将Redis与SignalR一起使用

lab*_*nth 17 c# asp.net-mvc redis asp.net-mvc-4 signalr

我有一个在服务器A上运行的ASP.NET MVC应用程序和在服务器B上运行的一些Web服务.我已经实现了我在服务器A上使用SignalR的实时通知.但是现在我需要服务器B也能够将消息发送到从服务器A(主Web应用程序)提供的View.因此,我在这里尝试使用Redis背板.

在我在服务器A的启动中,我添加了以下内容:

GlobalHost.DependencyResolver.UseRedis("localhost", 6379, string.Empty, "abc");
app.MapHubs();
Run Code Online (Sandbox Code Playgroud)

在这里,我假设"myApp"表示频道,当我publish abc "hello world"在Redis控制台上运行时,我可以看到订阅者计数返回为1,但我无法弄清楚SignalR集线器如何与频道交互.我在哪里收到服务器/视图上的消息?我们只能订阅一个redis频道吗?我们不能动态配置订阅特定频道吗?

编辑:如果我订阅,我可以在redis控制台上看到使用SignalR实现的聊天应用程序发送的消息abc.

此外,我现在已经在服务器A上实现了我自己的redis监听器,它在从redis通道接收消息时调用signalR hub功能.我相信必须有不同的方法来做到这一点,我希望redis背板可以帮助我但不确定它是如何工作的.

Erk*_*rel 39

背板在服务器之间分发消息.

GlobalHost.DependencyResolver.UseRedis("localhost", 6379, string.Empty, "abc");

这里,abc是redis通道,这意味着无论哪个服务器通过此通道连接到redis服务器,它们都将共享消息.SignalR通道(组)与Redis通道不同.您还可以共享SignalR通道(组)消息.

然后只需将Microsoft.AspNet.SignalR.Redis NuGet 安装到您的服务器上.

将您的服务器连接到Redis,如下所示:

 GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
 app.MapSignalR();
Run Code Online (Sandbox Code Playgroud)

然后,像以前一样使用你的信号器.你不必做任何其他事情.

当服务器A向客户端发送消息时,它将首先将消息发送给Redis.然后Redis将与所有订户(服务器A和B)共享该消息.然后,A和B将消息发送给他们的客户.(反之亦然,如果B发送消息,它将是相同的).

假设A向客户端发送消息. _context.Clients.All.TestMessage("Hello");

这将首先进入redis,redis将与A和B共享.

然后A和B都会将此消息发送给他们的客户.

_context.Clients.All.TestMessage("Hello");

但你不必担心这些事情.我之前说过.安装包,将服务器连接到redis并像以前一样使用signalr.

如果我们提出你的问题.答案是肯定的.服务器B可以通过信号器背板向服务器A客户端发送消息.

这张图片总结了我说的话:

在此输入图像描述