2013-01-03 29 views
6

由于各种原因,建立SignalR连接时,我将该ConnectionId存储在我的数据存储中。但是,如果SignalR重新启动,那些连接记录可能会成为孤立的。 (我也观察到行为,让我怀疑OnDisconnected()是否正确调用,虽然我不太确定这一点。)鉴于SignalR ConnectionId,我可以告诉该会话是否仍然连接?

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

我已经看过了SignalR的源代码,它并没有向我跳出如何最好地实现这一点。有没有合理的方法来做到这一点?

回答

4

完成此操作的方法是自行跟踪客户。从您的帖子看来,您似乎已经在执行此操作(如果不是,则仍提供代码),但这是了解客户端是否已连接的唯一方法。 SignalR服务器触发连接/断开连接的事件,以指示客户端是否连接。

我建议确保您不重新实例化数据库中的记录,但不正确地重新连接。

例如(超简单的例子):

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当前连接。

+0

这基本上是我现在正在做的,但它似乎没有正常工作。也许98%的时间,但每隔一段时间,我会关闭我的开发机器上的所有浏览器,然后当我回到我的房间时,它会相信我的版本中仍然有某些东西'_connectedClients',即使一切都应该已被清除。尽管如此,我没有这方面的报道,所以对你们来说帮助不大。我会告诉你,如果我能弄清楚是什么触发它 - 或者如果(也许更可能)它是我身边的错误。 –

+0

@N。 Taylor Mullen为什么你最后一次void返回bool值? –

+0

@aliyouhannaei没有理由,只是一个失败的代码片段。只是更新了它。 –

-1

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

0

它也发生在我身上,我不时发现一个孤立的连接。

作为工作的时候,我增加了一个客户端功能,$(窗口).unload它调用服务器端的函数,它应该做的事..

希望它可以帮助什么断开。

相关问题