将 Redis 与 SignalR 结合使用
Using Redis with SignalR
我有一个 ASP.NET MVC 应用程序 运行 在服务器 A 上 运行 和一些 Web 服务 运行 在服务器 B 上。我已经实现了实时通知在服务器 A 上使用 SignalR。但现在我需要服务器 B 也能够将消息发送到服务器 A(主要 Web 应用程序)提供的视图。因此,我正在尝试教程 here 涉及 Redis 底板。
在服务器 A 的启动中,我添加了以下内容:
GlobalHost.DependencyResolver.UseRedis("localhost", 6379, string.Empty, "abc");
app.MapHubs();
在这里,我假设"myApp"表示频道,当我在Redis控制台上运行 publish abc "hello world"
时,我可以看到返回的订阅者计数为1,但我不是能够弄清楚 SignalR 集线器如何与通道交互。我在哪里可以收到 server/view 上的消息?我们可以只订阅一个redis频道吗?我们不能动态配置订阅特定频道吗?
编辑:如果我订阅 abc
,我可以在 redis 控制台上看到使用 SignalR 实现的聊天应用程序发送的消息。
另外,现在我已经在服务器 A 上实现了我自己的 redis 侦听器,它在从 redis 通道接收消息时调用 signalR 集线器函数。我确信一定有不同的方法可以做到这一点,我希望 redis 底板可以帮助我,但不确定它是如何工作的。
背板在服务器之间分发消息。
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();
然后,像以前一样使用信号器。您无需执行任何其他操作。
当服务器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 可以通过 Signalr Backplane 向服务器 A 客户端发送消息。
这张图片总结了我所说的内容:
我有一个 ASP.NET MVC 应用程序 运行 在服务器 A 上 运行 和一些 Web 服务 运行 在服务器 B 上。我已经实现了实时通知在服务器 A 上使用 SignalR。但现在我需要服务器 B 也能够将消息发送到服务器 A(主要 Web 应用程序)提供的视图。因此,我正在尝试教程 here 涉及 Redis 底板。
在服务器 A 的启动中,我添加了以下内容:
GlobalHost.DependencyResolver.UseRedis("localhost", 6379, string.Empty, "abc");
app.MapHubs();
在这里,我假设"myApp"表示频道,当我在Redis控制台上运行 publish abc "hello world"
时,我可以看到返回的订阅者计数为1,但我不是能够弄清楚 SignalR 集线器如何与通道交互。我在哪里可以收到 server/view 上的消息?我们可以只订阅一个redis频道吗?我们不能动态配置订阅特定频道吗?
编辑:如果我订阅 abc
,我可以在 redis 控制台上看到使用 SignalR 实现的聊天应用程序发送的消息。
另外,现在我已经在服务器 A 上实现了我自己的 redis 侦听器,它在从 redis 通道接收消息时调用 signalR 集线器函数。我确信一定有不同的方法可以做到这一点,我希望 redis 底板可以帮助我,但不确定它是如何工作的。
背板在服务器之间分发消息。
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();
然后,像以前一样使用信号器。您无需执行任何其他操作。
当服务器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 可以通过 Signalr Backplane 向服务器 A 客户端发送消息。
这张图片总结了我所说的内容: