将消息推送到SignalR中的组

时间:2018-07-11 20:47:25

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

只是想让我决定处理通过SignalR 一些用户 推送数据。

说,在私人聊天情况下,Person APerson B发送消息。如果我正确理解该概念,则需要为每个登录系统的用户创建一个Group。这样,当收到来自Person A的新消息时,在我的SignalR Hub中,我会将消息发送到Person B的组,该组中只有一个用户,即{{ 1}}。

通过这种方法,我实质上将为每个用户创建一个唯一的Person B,以便我可以灵活地将数据推送给每个唯一的用户。我可以将Group用作UserId ID。

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

1 个答案:

答案 0 :(得分:1)

您可以像这样手动抓取客户端ID,然后使用hubcontext发送它们,以避免创建很多组(您只需要实现一个方法即可,在我的情况下,使用dtos可以从资源中获得连接)< / p>

我假设您的集线器具有某种类型的连接管理器,以下是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);
    }
}