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

标签 c# asp.net-mvc-3 mono redis signalr-hub

我有以下 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/

相关文章:

c# - 单击按钮时调用 _Paint

c# - 可能的 NullreferenceException

c# - 如何在 C# 中使用泛型调用 C 函数

c# - 如何动态改变 WPF 窗口的大小?

JavaScript 无法识别 Controller

.net - 我可以使用 protobuf-net 在 Mono 中序列化一个对象(包含成员 : Dictionary, 列表...等)并在 MS.NET 中反序列化它,反之亦然?

asp.net - ASP.NET MVC 路由的无限 URL 参数

visual-studio - Visual Studio 11 Beta/IIS 7.5:找不到Microsoft.ReportViewer.Common V11

c++ - 如何在 C++ 项目中使用非托管 .dll、.lib、.exp

.net - Mono 多目标项目中的项目引用与文件链接