【问题标题】:Groups across .Net core SignalR hubs跨 .Net 核心 SignalR 集线器的组
【发布时间】:2021-04-29 17:31:55
【问题描述】:

我正在使用 Azure SignalR 服务进行推送通知,并且实施涉及多个集线器。在 .net 框架中,组不能跨集线器重用。使用 Azure Signal 的 .net 核心实现是否相同?

【问题讨论】:

    标签: asp.net-core asp.net-core-signalr


    【解决方案1】:

    ASP.NET Core SignalR 为每种集线器类型存储不同的组和连接集合。但是您可以使用 IHubContext 引用不同集线器的上下文。它将使您有可能访问其他集线器的客户端和组。实际上,这看起来不是一个好习惯......看起来它通常用于从控制器或后台工作人员而不是其他集线器发送消息。 https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-5.0

    我没有在 azure signalr 中尝试过,但尝试了我本地文档中的修改示例,它有效。这是一个如何完成此行为的示例

    public class OtherHub : Hub
    {
        private readonly IHubContext<ChatHub> _chatHubContext;
    
        public OtherHub(IHubContext<ChatHub> chatHubContext)
        {
            _chatHubContext = chatHubContext ?? throw new ArgumentNullException(nameof(chatHubContext));
        }
    
        public async Task SendMessage(string user, string message, string group)
        {
            await _chatHubContext.Clients.Group(group).SendAsync("RecieveMessage", user, message);
        }
    }
    

    如果你对它内部如何工作感兴趣,SignalR源代码中的这个类负责管理组和连接 https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/server/Core/src/DefaultHubLifetimeManager.cs

    【讨论】:

      【解决方案2】:

      组是与名称相关联的连接集合。

      https://docs.microsoft.com/en-us/aspnet/core/signalr/groups?view=aspnetcore-5.0#groups-in-signalr

      我认为 - 我还没有测试过这个,所以这是非常推测的,但如果一个组只不过是一个连接的集合,你可以这样做:

      // Some user defined hub
      public async Task AddToGroup(string groupName)
      {
          // Add to own group
          await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
      
          // You'd need to use the DI to inject the other hubs into this one.
          MyOtherUserDefinedHub.AddToGroupAsync(Context.ConnectionId, groupName);
          MySecondOtherUserDefinedHub.AddToGroupAsync(Context.ConnectionId, groupName);
      
          await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
      }
      
      

      我认为使用示例应用程序来测试它会很容易。 这假设每个集线器都有一个连接 ID,imo 似乎很可能,但我没有在网上找到任何关于此的资源。

      编辑:似乎用户 Anton 测试了连接 ID 是否在集线器之间共享 - 但显然它们不是。这意味着这个提议似乎无效并且没有内置的方法。

      【讨论】:

      • 这根本行不通。集线器不能在自己的集线器之外被引用,集线器不知道与其他集线器的连接。
      • @Brennan Hubs 当然可以从外部引用,如此处所述:docs.microsoft.com/en-us/aspnet/core/signalr/… 我也相信连接 ID 在集线器之间共享,这意味着我在此答案中提出的建议是有效的。
      • @sommmen 我不认为集线器之间共享连接 ID,因为要通过同一个客户端访问不同的集线器,您需要实例化新连接,我认为不同的连接应该有不同的连接 ID
      • @Anton 连接 - 可以说,如果您愿意,每个浏览器选项卡都是唯一的。但这并不意味着某个连接的 ChatHub 的 ID 与 OtherHub 的 ID 不同 - 它只是可能
      • @sommmen 好的,我在本地尝试连接到两个不同的集线器并获得不同的连接 ID。这是因为服务器在协商两个集线器的两个不同 http 连接/请求期间解析连接 ID,并且它对选项卡一无所知。我之前没有检查过这部分 asp.net 核心代码,但是对于这种情况,我检查了协商并找到了连接 ID 解析的位置,它为每个协商“RandomNumberGenerator.Fill(buffer)”生成随机字节序列,所以我认为不同的集线器对于同一个客户端不会有相同的连接 ID
      猜你喜欢
      • 2018-09-21
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多