问题描述
正如标题所述,如何使用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);
}
。