管理SignalR Core 3.1的连接事件



我使用的是dotnet客户端和Asp.Net核心SignalR v.3.1

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

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

我怎么能这么做?

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

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

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

为了检查组是否包含任何连接的客户端,作为一种变通方法,在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);
}
}

最新更新