7

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

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

我已经查看了 SignalR 源代码,并没有向我提出如何最好地完成此任务。有没有合理的方法来做到这一点?

4

3 回答 3

3

实现这一点的方法是自己跟踪客户。从您的帖子看来,您似乎已经在执行此操作(仍提供代码以防万一),但这是了解客户端是否已连接的唯一方法。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。

于 2013-01-03T04:37:16.537 回答
0

它也发生在我身上,我不时检测到孤立的连接。

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

希望能帮助到你。

于 2013-01-23T08:05:11.210 回答
-1

在数据库中存储 connectionId 不是好方法。SignalR 将为每个页面分配一个新的 id。试试这个Kevin W. Griffin 的样本

于 2013-01-08T06:35:14.713 回答