【问题标题】:How to determine if a group exists in the SignalR .net core如何确定 SignalR .net 核心中是否存在组
【发布时间】:2020-12-04 12:00:00
【问题描述】:

我正在练习使用 signalr .net 核心制作聊天室。我想当用户输入组名并加入组时,我检查该组是否存在? 如果它不存在,它将通知该用户。

通常我注意到,当我使用下面的 JoinRoom 功能时,如果该组不存在,那么系统将为我创建一个新组。

public async Task JoinRoom(string roomName, string username) 
        {            
            await Groups.AddToGroupAsync(Context.ConnectionId, roomName);
            await Clients.Group(roomName).SendAsync(username + " joined.");
        } 

但我只是想让系统宣布该组不存在,不需要创建新组。

有人可以帮我吗? 谢谢。

【问题讨论】:

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


    【解决方案1】:

    与某些人存储连接 ID 一样,您可以存储组。

    您可以创建一个您将根据需要添加和删除的组列表,在这种情况下,您还可以检查组是否存在。

    您创建的组列表如下:

    IList<string> myGroups = new List<string>();
    

    然后您在需要的地方创建组并创建房间验证方法:

    public void CreateRoom(string roomName) 
    {            
        this.myGroups.Add(roomName);
    }
    
    public void DeleteRoom(string roomName) 
    {            
        this.myGroups.Remove(roomName);
    } 
    
    public bool CheckIfRoomExists(string roomName)
    {
        return this.myGroups.Contains(roomName);
    }
    

    最后你可以在加入房间时检查房间是否存在:

    public async Task JoinRoom(string roomName, string username) 
    {           
        if (CheckIfRoomExists(roomName));
        {
            await Groups.AddToGroupAsync(Context.ConnectionId, roomName);
            await Clients.Group(roomName).SendAsync(username + " joined.");
        }
        else
        {
            throw new Exception("The room does not exists!");
        }
    }
    

    您现在可以根据需要调整此代码。例如,如果组不存在,则通知用户它不存在并且不抛出异常,或者您可能调用创建组方法等...

    【讨论】:

    • 感谢您回答我。我会试试的。
    • 你测试过这个吗?我不认为集线器是一个单身人士来做到这一点。但是有一个Context.Features 属性可以用来保存
    • 集线器总是瞬态的。也许最好的选择是将组存储在集线器之外的另一个服务中,并在集线器@NevilleNazerane 中解决该服务
    猜你喜欢
    • 2018-09-21
    • 1970-01-01
    • 2020-01-28
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多