【发布时间】:2021-07-20 17:28:43
【问题描述】:
我正在使用 dotnet 客户端和 Asp.Net core SignalR v. 3.1
我希望能够检测(服务器端)用户何时失去连接并且当前正在尝试重新连接或由于错误而失去连接。
不幸的是,OnDisconnectedAsync 函数仅在用户断开连接时调用,而不是在用户重新连接时调用。
我该怎么做?
【问题讨论】:
我正在使用 dotnet 客户端和 Asp.Net core SignalR v. 3.1
我希望能够检测(服务器端)用户何时失去连接并且当前正在尝试重新连接或由于错误而失去连接。
不幸的是,OnDisconnectedAsync 函数仅在用户断开连接时调用,而不是在用户重新连接时调用。
我该怎么做?
【问题讨论】:
我希望能够检测(服务器端)用户何时失去连接 并且当前正在尝试重新连接或由于连接丢失 到一个错误。
据我所知,目前 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);
}
}
【讨论】: