gpt4 book ai didi

c# - SignalR OnConnected 与多个服务器和 Redis 背板

转载 作者:可可西里 更新时间:2023-11-01 11:01:33 26 4
gpt4 key购买 nike

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

    public abstract class HubBase : Hub    {      private readonly static ConnectionMapping Connections = new ConnectionMapping();      public override Task OnConnected()      {        Connections.Add(Context.User.Identity.Name, Context.ConnectionId);        return base.OnConnected();      }    }

我将连接的用户存储在一个静态变量中,这样我就可以将 connectionId 映射到用户名,并且可以稍后向特定用户发送消息。

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

如果没有在所有服务器上调用它,处理这种情况的推荐方法是什么?

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

最佳答案

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

这里是一个数据库实现的链接,用于将用户映射到他们的 connectionIds

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

关于c# - SignalR OnConnected 与多个服务器和 Redis 背板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19421331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com