将消息推送到 SignalR 中的组
Pushing message to groups in SignalR
我只是想集中精力处理通过 SignalR
.
向 一些用户 推送数据
比如说,在私人聊天的情况下,Person A
向 Person B
发送了一条消息。如果我正确理解了这个概念,我需要为每个登录系统的用户创建一个 Group
。这样,当来自 Person A
的新消息出现时,在我的 SignalR Hub
中,我会将消息发送到 Person B
的组,其中只有一个用户,即 Person B
.
在这种方法中,我基本上会为每个用户创建一个唯一的 Group
,这样我就可以灵活地将数据推送给每个唯一的用户。我可以使用 UserId
作为 Group
ID。
这是将数据选择性地推送给每个唯一用户的方法吗?
您可以像这样手动获取客户端 ID,然后使用 hubcontext 发送它们以避免创建大量组(您只需要实现一个方法,在我使用 dtos 的情况下从您的资源获取连接)
我假设您的集线器有某种类型的连接管理器,这是 docs
中的一个示例
在我的例子中,我有一个动态配置,用于使用 DTO 类型配置我的集线器,我使用通用集线器基础发送集线器,这是一个示例实现:
警告:情况可能略有不同我在此示例中使用的是 .Net-Core
//NOTE: THub must be the one Registered with MapHubs in the Startup
//class or your connections won't be there because Hubs are not contravarient
public abstract class HubBase<TDTO, THub> : Hub
Where THub: HubBase<TDTO, THub>
{
protected IHubContext<THub> hubContext;
HubBase(IHubContext<THub> hubContext)
{
this._hubContext = hubContext;
}
protected abstract List<string> GetConnectionsByDto(TDTO dto)
protected async Task SendFilteredAsync(string eventName, TDTO dto)
{
var clientIds = await this.GetConnectionsByDto(dto);
if (false == clientIds.Any())
{
return;
}
var broadcastTasks = clientIds.Select(async clientId =>
await this._hubContext.Clients.Client(clientId).SendAsync(eventName, dto));
await Task.WhenAll(broadcastTasks);
}
}
我只是想集中精力处理通过 SignalR
.
比如说,在私人聊天的情况下,Person A
向 Person B
发送了一条消息。如果我正确理解了这个概念,我需要为每个登录系统的用户创建一个 Group
。这样,当来自 Person A
的新消息出现时,在我的 SignalR Hub
中,我会将消息发送到 Person B
的组,其中只有一个用户,即 Person B
.
在这种方法中,我基本上会为每个用户创建一个唯一的 Group
,这样我就可以灵活地将数据推送给每个唯一的用户。我可以使用 UserId
作为 Group
ID。
这是将数据选择性地推送给每个唯一用户的方法吗?
您可以像这样手动获取客户端 ID,然后使用 hubcontext 发送它们以避免创建大量组(您只需要实现一个方法,在我使用 dtos 的情况下从您的资源获取连接)
我假设您的集线器有某种类型的连接管理器,这是 docs
中的一个示例在我的例子中,我有一个动态配置,用于使用 DTO 类型配置我的集线器,我使用通用集线器基础发送集线器,这是一个示例实现:
警告:情况可能略有不同我在此示例中使用的是 .Net-Core
//NOTE: THub must be the one Registered with MapHubs in the Startup
//class or your connections won't be there because Hubs are not contravarient
public abstract class HubBase<TDTO, THub> : Hub
Where THub: HubBase<TDTO, THub>
{
protected IHubContext<THub> hubContext;
HubBase(IHubContext<THub> hubContext)
{
this._hubContext = hubContext;
}
protected abstract List<string> GetConnectionsByDto(TDTO dto)
protected async Task SendFilteredAsync(string eventName, TDTO dto)
{
var clientIds = await this.GetConnectionsByDto(dto);
if (false == clientIds.Any())
{
return;
}
var broadcastTasks = clientIds.Select(async clientId =>
await this._hubContext.Clients.Client(clientId).SendAsync(eventName, dto));
await Task.WhenAll(broadcastTasks);
}
}