Signalr 将消息推送到信号器中的组

Signalr 将消息推送到信号器中的组,signalr,signalr-hub,signalr.client,asp.net-core-signalr,Signalr,Signalr Hub,Signalr.client,Asp.net Core Signalr,我只是想通过signal将数据推送到一些用户那里 比如说,在私人聊天情况下,人a向人B发送消息。如果我正确理解了这个概念,我需要为每个登录系统的用户创建一个组。这样,当来自人员A的新消息传入时,在我的信号集线器中,我会将消息发送给人员B的组,该组中只有一个用户,即人员B 在这种方法中,我将为每个用户创建一个唯一的组,这样我就可以灵活地将数据推送到每个唯一的用户。我可以使用UserId作为GroupId 这是处理选择性地将数据推送到每个唯一用户的方法吗?您可以像这样手动获取客户端ID,然后使用hu

我只是想通过
signal
将数据推送到一些用户那里

比如说,在私人聊天情况下,
人a
人B
发送消息。如果我正确理解了这个概念,我需要为每个登录系统的用户创建一个
组。这样,当来自
人员A
的新消息传入时,在我的
信号集线器
中,我会将消息发送给
人员B
的组,该组中只有一个用户,即
人员B

在这种方法中,我将为每个用户创建一个唯一的
,这样我就可以灵活地将数据推送到每个唯一的用户。我可以使用
UserId
作为
Group
Id


这是处理选择性地将数据推送到每个唯一用户的方法吗?

您可以像这样手动获取客户端ID,然后使用hubcontext发送它们,以避免创建大量组(在我的例子中,您只需要实现一种从资源获取连接的方法,即使用DTO)

我假设您的集线器具有某种类型的连接管理器,下面是来自

在我的例子中,我有一个动态配置,用于使用DTO类型配置集线器,并使用通用集线器库发送集线器。下面是一个示例实现:

警告:在本例中,我使用的.NETCore可能略有不同

//注意:THub必须是启动时向MapHubs注册的
//类,否则您的连接将不存在,因为集线器不是相反的
公共抽象类HubBase:Hub
休伯斯在哪里
{
受保护的IHubContext-hubContext;
HubBase(IHubContext-hubContext)
{
这个。_hubContext=hubContext;
}
受保护的抽象列表GetConnectionsByDto(TDTO dto)
受保护的异步任务SendFilteredAsync(字符串eventName,TDTO dto)
{
var clientIds=wait this.GetConnectionsByDto(dto);
if(false==clientId.Any())
{
返回;
}
var broadcastTasks=clientId.Select(异步clientId=>
等待此消息。_hubContext.Clients.Client(clientId.SendAsync(eventName,dto));
等待任务。WhenAll(广播任务);
}
}

是的,在将a发送到b的情况下,您可以按客户机ID进行筛选谢谢。因此,如果我的应用程序很受欢迎,那么我最终会有很多组,这会给
signal
的可伸缩性带来问题。你认为这会是一个问题吗?我将发送推送集线器的任务卸载到后台服务,这样初始更新就可以发生并返回,然后后台工作人员处理发送集线器的任务,这样就不会有太多问题了。请您回复。我还研究了Azure SignalR服务的可伸缩性。这对你来说更好,因为他们有一种更可靠的方式来加载后台任务。我需要更多的说明。我认为在您的示例中,ClientId是UserId。我想你是建议我为每个人保留一个连接Id的记录,这样当消息到达时,我可以查找我需要的连接Id,以便使用客户端Id将消息推送到。是这样吗?@Sam我假设集线器正在使用某种连接管理器的实现,它根据一些关键的用户ID或jwt主题来跟踪您的用户。如果你要发送dto,你应该有一种方法来过滤你需要发送给的用户Id,例如只需找到发送者和接收者,并在那里查找连接是的,当消息到达我的中心时,我的dto就有属于私人聊天的用户Id。那部分很简单。但目前,我没有将分配给用户的连接Id存储在任何位置。如果我正确理解了您的示例,您建议我将其存储在某个位置,这样我可以简单地说,为用户A和B提供连接ID,然后将消息推送到这些连接。如果这是你的建议,我将不得不在某个地方存储UserId、ConnectionId键值对。我已经在我的应用程序中使用了Redis,所以我认为这是一种方法。它不便宜,但快速可靠。再次感谢你的帮助!在我的情况下,通过向我的
Hub
发送消息,我会发送聊天室中所有用户的
Id
。在我的
Chat
对象中,我可以随时找到该特定聊天的所有参与者。因此,当我将消息发送到包含
UserId
Hub
时,我只需发出
wait Clients.User(UserId.ToString()).sendsync(“new_message”,message)
和该特定用户获得消息
SignalR
似乎有一种内置的方式将
UserId
s映射到
ConnectionId'
s