【问题标题】:ASP.NET Core SignalR route messages only to certain clientsASP.NET Core SignalR 仅将消息路由到某些客户端
【发布时间】:2018-11-15 17:32:51
【问题描述】:

我有一个 ASP.NET Core 站点,我在其中实现了一个 Hub,称为 NotificationHub:

public interface INotificationHub
{      
    Task SendNotificationMessage(NotificationMessage message);
}

public class NotificationHub : Hub<INotificationHub>
{    
     public async Task SendMessage(NotificationMessage message)
     {          
        await Clients.All.SendNotificationMessage(message);
     }
}

我有两个可以成功连接到集线器并发送/接收消息的 winforms 客户端。我的网站上还有一个页面,可以通过注入到我的控制器中的 HubContext 发送消息。

   await _hubContext.Clients.All.SendNotificationMessage(new NotificationMessage { "some message"  });

理想情况下,我希望将消息发送到特定客户端而不是所有客户端。我知道当客户端连接时,我在 OnConnectedAsync 方法中有可用的 Context.ConnectionId,但我不确定如何映射它,因此我只能将某些消息从控制器(或 javascript)路由到某些客户端。即,我的网站上发生了某项活动,我只想通知一个客户而不是另一个客户。

【问题讨论】:

  • 第一件事。您的客户有关联的用户登录?可以匿名吗?发出此通知的条款是什么?
  • 如果客户端是登录用户,您可以定义一个字典,其中包含连接的客户端 connectionId 值,与登录的用户名或 ID 相关联。或者您可以添加其他字段以将 connectionId 保存到 users 表,但在这种情况下,您必须在每次连接断开后更新相关的 db 字段。
  • 我没有任何安全设置,因为我不确定如何实施。我读过有关使用 JWT 令牌的信息,这是正确的想法吗?
  • @Laz Ziya,我应该把这本词典放在哪里?我需要从控制器访问它,但无法存储在 Hub 中。
  • 这个页面冷帮助你,它包含两个关于如何保存连接的示例; 1. In Memory 2. Database 如果您需要从控制器访问连接,那么数据库可能是解决方案。

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


【解决方案1】:

如果您使用的是最新版本,您应该可以通过用户 ID 进行操作。

public async Task SendMessage(string userId, string message)
{
    await Clients.User(userId).SendAsync(message);
}

await _hubContext.Clients.User(userId).SendNotificationMessage(new NotificationMessage { "some message"  });

【讨论】:

  • 我在集线器内有那个 userId,但我需要将它存储在某个地方,因为我将在我的整个网络应用程序中调用集线器方法,而不仅仅是在集线器内。所以我想我需要存储在字典中。这似乎是我正在阅读的内容。
  • 也许您应该将 userId 作为参数发送。并在您调用集线器的控制器方法中获取它。 var userId = _userManager.GetUserId(User); await _hubContext.Clients.User(userId).SendNotificationMessage(new NotificationMessage { "some message" });
猜你喜欢
  • 2018-11-20
  • 2013-05-21
  • 1970-01-01
  • 2019-10-07
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2020-10-15
相关资源
最近更新 更多