使用 SignalR (ASP.NET Core) 的多个单聊天室

Posted

技术标签:

【中文标题】使用 SignalR (ASP.NET Core) 的多个单聊天室【英文标题】:Multiple Single Chat Rooms using SignalR (ASP.NET Core) 【发布时间】:2019-07-16 13:04:44 【问题描述】:

我必须在两个用户(一个被雇佣的人和一个雇佣者)之间创建一个聊天。它不需要是实时的,但使用 SignalR 我可以做到这一点,但没问题。

我会将以前的消息存储在数据库中,以便在每次打开聊天时检索。

所以,我只需要在两个用户之间广播一条消息,但是,一个用户可以有多个聊天室和不同的人(但只有 1:1)。

如何在我的代码中实现该逻辑?我必须使用群组吗?如果是这样,我如何在 1:1 聊天中存储“此用户必须向该用户发送消息”的信息,而不是向所有人广播?

我的 ChatHub 课程:

public class ChatHub : Hub

    private readonly IChatAppService _chatAppService;

    public ChatHub(IChatAppService chatAppService)
    
        _chatAppService = chatAppService;
    

    public string GetConnectionId()
    
        return Context.ConnectionId;
    

    public async Task SendMessage(ChatAddVM message, string userName)
    
        string connectionId = GetConnectionId();

        await Clients.Client(connectionId).SendAsync("broadcastMessage", userName, message.Message);
        //USED TO SAVE THE MESSAGE ON DB
        await _chatAppService.CreateMessage(message);
    

【问题讨论】:

【参考方案1】:

关于这个问题

如何存储“此用户必须向其发送消息”的信息 那个用户”,在 1 对 1 聊天中,而不是向所有人广播?

我认为您可以将信息存储到数据库中,例如从哪个用户到哪个用户聊天。因为您已经在用户与用户之间存储了以前的消息,所以我认为您可以这样做

还有1:1之间发消息我写小博here大家可以看看

这个想法是每个用户都有 1 个连接 ID,所以我们需要将用户的连接 ID 存储在内存中,以便从 1 到 1 发送消息

【讨论】:

完美!我将使用集线器上的结构和 ConnectionIds 字典来完成此操作。谢谢!

以上是关于使用 SignalR (ASP.NET Core) 的多个单聊天室的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core SignalR :SignalR Javascript 客户端

发现 ASP.NET Core SignalR

使用 SignalR (ASP.NET Core) 的多个单聊天室

ASP.NET Core的实时库: SignalR -- 预备知识

使用ASP.NET CORE SignalR实现APP扫描登录

ASP.NET Core Angular - 根据登录用户发送不同的 SignalR 消息