SignalR – 检查用户是否仍然连接
我有一个方法集线器,称为客户端。 此方法启动一个带有委托的计时器,该委托每10秒运行一次。 由于如果没有人连接到集线器,继续运行此委托是没有意义的,我想在重新计划之前检查是否有任何用户仍然从委托内部连接。 有没有办法做到这一点?
可能最常用的解决方案是保留包含当前连接的用户的静态变量,并覆盖OnConnect
和OnDisconnect
或者根据您使用的版本实现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示例来跟踪用户,当您达到零时,用户将停止呼叫。