SignalR On与多个服务器和Redis背板连接

本文关键字:Redis 连接 服务器 On SignalR | 更新日期: 2023-09-27 18:35:54

我有以下Hub片段与SignalR,Redis背板和单个服务器一起工作。

   公共抽象类 HubBase : Hub    {      私有只读静态连接映射连接 = 新的连接映射();      公共覆盖任务连接()      {        Connections.Add(Context.User.Identity.Name, Context.ConnectionId);        返回基地。OnConnected();      }    }

我将连接用户存储在静态变量中,以便我可以将连接 ID 映射到用户名,并能够在以后向特定用户发送消息。

我的问题是,是否会在 SignalR 场中的所有服务器上调用 OnConnected 函数?我测试了它,从外观上看,它只在客户端连接的服务器上被调用。

如果未在所有服务器上调用它,则处理此类情况的建议方法是什么?

编辑:现在考虑这个问题,我意识到我的示例代码可能存在严重缺陷。如果 OnConnected 方法也在另一台服务器上调用,则显然不会设置 Context.User.Identity.Name,因为调用没有请求。我想解决这个问题的唯一方法是使用组。

SignalR On与多个服务器和Redis背板连接

有一种方法可以做到这一点,但正如 Penderi 所说,信号器是无状态的,因此不能保证特定用户仍然处于连接状态。我不确定Redis,但是SQL服务器背板使用IMessageBus,它将所有消息存储在本地缓存中,如果用户断开连接,则IMessageBus进程将发送自用户断开连接以来已广播的所有消息当用户重新连接时。需要注意的是,缓存只保存消息这么长时间。

下面是一个数据库实现的链接,用于将用户映射到其 connectionId

https://learn.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections#database