给定SignalR ConnectionId,我可以判断该会话是否仍然连接?

Ken*_*ith 7 signalr

由于各种原因,当建立SignalR连接时,我将ConnectionId存储在我的数据存储区中.但是,例如,如果SignalR重新启动,那些连接记录可能会变为孤立.(我也观察到行为让我怀疑OnDisconnected()是否被正确调用,尽管我对此不太确定.)

但无论出于何种原因,我会定期在我的数据库中找到孤立的记录,我希望能够修剪那些,并删除任何实际上没有连接的ConnectionID - 大概是让SignalR告诉我是否此ConnectionID仍与实时会话相关联.

我已经查看了SignalR信号源,并没有向我跳出如何最好地完成此任务.有合理的方法吗?

N. *_*len 5

实现这一目标的方法是自行跟踪客户。从您的帖子来看,您似乎已经在这样做(如果您没有这样做,仍然提供代码),但这是了解客户端是否已连接的唯一方法。SignalR 服务器触发 onconnected/ondisconnected 事件作为指示客户端是否已连接的方式。

我建议确保您在重新连接时不会错误地重新实例化数据库中的记录。

例如(超级简单的例子):

class myHub
{
    private static List<String> _connectedClients = new List<String>();

    public override Task OnConnected()
    {
        _connectedClients.Add(Context.ConnectionId);
        return base.OnConnected();
    }

    public override Task OnDisconnected()
    {
        _connectedClients.Remove(Context.ConnectionId);
        return base.OnDisconnected();
    }

    public static bool IsConnected(string cid)
    {
        return _connectedClients.Contains(cid);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在集线器上调用 IsConnected 来确定连接 ID 当前是否已连接。