SignalR – 检查用户是否仍然连接

我有一个方法集线器,称为客户端。 此方法启动一个带有委托的计时器,该委托每10秒运行一次。 由于如果没有人连接到集线器,继续运行此委托是没有意义的,我想在重新计划之前检查是否有任何用户仍然从委托内部连接。 有没有办法做到这一点?

可能最常用的解决方案是保留包含当前连接的用户的静态变量,并覆盖OnConnectOnDisconnect或者根据您使用的版本实现IDisconnect

你会实现这样的事情:

 public class MyHub : Hub { private static List users = new List(); public override Task OnConnected() { users.Add(Context.ConnectionId); return base.OnConnected(); } //SignalR Verions 1 Signature public override Task OnDisconnected() { users.Remove(Context.ConnectionId); return base.OnDisconnected(); } //SignalR Version 2 Signature public override Task OnDisconnected(bool stopCalled) { return base.OnDisconnected(stopCalled); } // In your delegate check the count of users in your list. } 

如果将connectionId保存在数据库中,则可以检查:

 var heartBeat = GlobalHost.DependencyResolver.Resolve(); var connectionAlive = heartBeat.GetConnections().FirstOrDefault(c=>c.ConnectionId == connection.ConnectionId); if (connectionAlive.IsAlive) { //Do whatever... } 

来自http://forums.asp.net/t/1829432.aspx/1?How+do+I+get+list+of+connected+clients+on+signalr+

 IHubContext context = GlobalHost.ConnectionManager.GetHubContext(); context.Clients.notify("Hello world"); 

所以你应该能够获得context.Clients.Count。

该post还引用了wiki ,它有很多好的信息。 您可以尝试使用OnConnected / OnDisconnected示例来跟踪用户,当您达到零时,用户将停止呼叫。