3

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

    公共抽象类 HubBase : Hub
    {
      私有只读静态 ConnectionMapping Connections = new ConnectionMapping();

      公共覆盖任务 OnConnected()
      {
        Connections.Add(Context.User.Identity.Name, Context.ConnectionId);
        返回 base.OnConnected();
      }
    }

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

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

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

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

4

1 回答 1

0

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

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

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

于 2017-04-13T19:45:49.860 回答