SignalR,如何验证连接ID是否仍处于活动状态?

问题描述

正如标题所述,如何使用SignalR验证连接ID是否仍处于活动状态? 我有如下类似的内容,其中将连接ID​​映射到用户ID。问题在于,在极少数情况下,OndisconnectedAsync不会触发。

然后我无法在用户加入或离开的地方创建该功能,因为它认为用户仍然有连接。

我确实有一个“ pinger”,每5分钟运行一次,它会更新到期日期,但是它不可靠。 我想要的是诸如遍历所有连接ID并验证它们是否仍处于活动状态的东西。

这怎么办?我以为也许可以向用户X的所有连接ID发送一条消息,看看我是否得到了一些东西,然后进行某种清理?

public class Chat : Hub
{
    private IConnectionManager _manager;
    public Chat(IConnectionManager manager)
    {
        _manager = manager;
    }
public override Task OnConnectedAsync()
    {
       // Add connectionId and any other info you want to your connectionManager
        _manager.Add(Context.ConnectionId,Context.User,Context.GetHttpContext());
    }
public override Task OndisconnectedAsync(Exception exception)
    {
       _manager.Remove(Context.ConnectionId);
    }
}

解决方法

myfile.cpp有其自己的“ pinger”。

SignalR

您可以在启动时对其进行配置,例如:

//
// Summary:
//     Gets or sets the interval used by the server to send keep alive pings to connected
//     clients. The default interval is 15 seconds.
public TimeSpan? KeepAliveInterval { get; set; } 

因此,基本上,如果客户端在定义的时间段内未响应,它将触发services.AddSignalR(hubOptions => { hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(hostConfiguration.SignalR.KeepAliveInterval); }