给定一个SignalR ConnectionId,我可以告诉您该会话是否仍处于连接状态吗?

给定一个SignalR ConnectionId,我可以告诉您该会话是否仍处于连接状态吗?,signalr,Signalr,由于各种原因,当建立信号器连接时,我会将该ConnectionId存储在数据存储中。但是,这些连接记录可能会成为孤立记录,例如,如果信号器重新启动。(我还观察到一些行为,这些行为让我怀疑OnDisconnected()是否被正确调用,尽管我对此不太确定。) 但无论出于何种原因,我的数据库中会定期出现孤立的记录,我希望能够删减这些记录,并删除列出的任何不再实际连接的ConnectionID—大概是让Signaler告诉我此ConnectionID是否仍与实时会话相关联 我查看了信号源,它并没有跳出

由于各种原因,当建立信号器连接时,我会将该ConnectionId存储在数据存储中。但是,这些连接记录可能会成为孤立记录,例如,如果信号器重新启动。(我还观察到一些行为,这些行为让我怀疑OnDisconnected()是否被正确调用,尽管我对此不太确定。)

但无论出于何种原因,我的数据库中会定期出现孤立的记录,我希望能够删减这些记录,并删除列出的任何不再实际连接的ConnectionID—大概是让Signaler告诉我此ConnectionID是否仍与实时会话相关联


我查看了信号源,它并没有跳出来告诉我如何最好地实现这一点。有没有一种合理的方法可以做到这一点?

实现这一点的方法是自己跟踪客户。从你的帖子来看,似乎你已经在做这件事了(如果你没有做的话,仍然提供代码),但这是知道客户端是否已连接的唯一方法。信号服务器触发中的onconnected/ondisconnected事件,以指示客户端是否已连接

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

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

classmyhub
{
私有静态列表_connectedClients=new List();
已连接的公用覆盖任务()
{
_connectedClients.Add(Context.ConnectionId);
返回base.OnConnected();
}
公共覆盖任务OnDisconnected()
{
_connectedClients.Remove(Context.ConnectionId);
返回base.OnDisconnected();
}
公共静态布尔已断开连接(字符串cid)
{
返回_connectedClients.Contains(cid);
}
}

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

将connectionId存储在DB中不是好方法。信号员将为每一页分配一个新id。试试这个

它也发生在我身上,有时我会检测到一个孤立的连接

作为一种解决方法,我添加了一个客户端函数$(window).unload,它调用了一个服务器端函数,执行断开连接应该执行的操作


希望能有帮助。

我现在基本上就是这么做的,但它似乎工作不正常。也许98%的时间是这样的,但我会时不时地关闭我的开发机器上的所有浏览器,然后当我回到房间时,它会确信我的
\u connectedClients
版本中仍然有一些东西,尽管一切都应该被清除。不过,我没什么可重复的,所以这对你们没什么帮助。我会让你知道是什么触发了它——或者(可能更可能)它是我这边的一个bug。@N.Taylor Mullen为什么你上次的void返回bool值???@aliyouhannaei没有原因,只是一个失败代码片段。刚刚更新。@N.泰勒·马伦,这只是为了好玩;)我可以在javascript中调用此方法吗?我想在发送新消息之前检查目的地id,或者在关闭聊天室之前发送消息的任何方式?如果您将IsConnected更改为非静态,您将能够从JS调用它。一旦应用程序关闭,连接也会关闭,因此无法接收任何进一步的消息。
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);
    }
}