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

时间:2013-01-03 01:15:27

标签: signalr

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

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

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

3 个答案:

答案 0 :(得分:4)

实现此目的的方法是自己跟踪客户。从您的帖子看来,您似乎已经在做这个(如果您不是,仍提供代码),但这是了解客户端是否已连接的唯一方法。 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);
    }
}

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

答案 1 :(得分:0)

我也偶然发现了一个孤立的连接。

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

希望它有所帮助。

答案 2 :(得分:-1)

在DB中存储connectionId不是好方法。 SignalR将为每个页面分配一个新的id。试试这个sample of Kevin W. Griffin