【问题标题】:Managing connection events for SignalR Core 3.1管理 SignalR Core 3.1 的连接事件
【发布时间】:2021-07-20 17:28:43
【问题描述】:

我正在使用 dotnet 客户端和 Asp.Net core SignalR v. 3.1

我希望能够检测(服务器端)用户何时失去连接并且当前正在尝试重新连接或由于错误而失去连接。

不幸的是,OnDisconnectedAsync 函数仅在用户断开连接时调用,而不是在用户重新连接时调用。

我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    我希望能够检测(服务器端)用户何时失去连接 并且当前正在尝试重新连接或由于连接丢失 到一个错误。

    据我所知,目前 Asp.net core SignalR 没有内置方法来检查客户端是否连接,或者组中是否存在任何客户端。而从official document,我们还可以发现:

    连接重新连接时不会保留组成员身份。重新建立连接时需要重新加入组。无法计算组的成员数,因为如果应用程序扩展到多台服务器,则无法获得此信息。

    要检查组是否包含任何连接的客户端,作为一种解决方法,在 hub 方法中,您可以定义一个全局变量来存储组名和在线计数,或者您可以存储用户信息(用户名、组名,在线状态等)在数据库中。

    在 OnConnectedAsync 方法中,您可以将用户添加到组并计算在线数或更改用户的在线状态,在 OnDisconnectedAsync 方法中,将用户从组中删除并更改在线用户数。创建一个自定义方法来检查/获取在线用户数。

    这样的代码:

    public class ChatHub : Hub
    {
        private readonly ApplicationDbContext _context;
    
        public ChatHub(ApplicationDbContext context)
        {
            _context = context;
        }
        public override Task OnConnectedAsync()
        {
            //add user to group 
            //store the group information into database or global variable.               
            return base.OnConnectedAsync();
        }
        public async Task SendMessage(string user, string message)
        { 
            
            await Clients.All.SendAsync("ReceiveMessage", user, message);
        }
         
        //send message to group
        public async Task SendMessageToGroup(string sender, string receiver, string message)
        {
    
            await Clients.Group(receiver).SendAsync("ReceiveMessage", sender, message);
        }
    
        //Create a custom method: query the group table and get the count of online user.
        public async Task GetOnlineCount(string groupname)
        { 
             
        }
    
        public override async Task OnDisconnectedAsync(Exception exception)
        {
            //remove user from group 
            //update the group table
            await base.OnDisconnectedAsync(exception);
        }
    }
    

    【讨论】:

    • 我了解您的解决方案,并且跟踪用户是我已经做的事情。当然,我可以向所有用户发送 Heartbeat 以检查他们是否正在响应,但这不是已经由框架完成了吗?没有我可以覆盖的功能或我可以实现的接口来利用它吗?我想避免让 SingalR 和我自己的代码用 ping 轰炸用户。谢谢你的回答!
    • 嗨@AsPas,据我所知,目前Asp.net核心SignalR没有内置方法来检查客户端是否连接,我建议你可以提交一个通过this link反馈这个功能,希望下个版本有这个功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2020-08-24
    • 2020-08-17
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多