我有一个使用客户端方法的集线器。此方法将启动一个计时器,该计时器每10秒运行一次委托。如果没有人连接到集线器,继续运行该委托没有意义,因此我想在重新安排委托之前检查是否仍从委托内部连接了任何用户。有什么办法吗?
可能最常用的解决方案是使静态变量包含当前连接的用户,并根据所使用的版本覆盖OnConnect
和OnDisconnect
或实现IDisconnect
。
您将执行以下操作:
public class MyHub : Hub
{
private static List<string> users = new List<string>();
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)
{
users.Remove(Context.ConnectionId);
return base.OnDisconnected(stopCalled);
}
// In your delegate check the count of users in your list.
}
如果将connectionId保存在数据库中,则可以检查以下内容:
var heartBeat = GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>();
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<MyHub>();
context.Clients.notify("Hello world");
所以您应该能够获得context.Clients.Count。
该帖子还引用了wiki,其中包含很多很好的信息。您可以尝试使用OnConnected / OnDisconnected示例跟踪用户,并在达到零时停止呼叫。
我已经这样做:
public class PrincipalCommunicator
{
public readonly static Lazy<PrincipalCommunicator> _instance = new Lazy<PrincipalCommunicator>(
() => new PrincipalCommunicator(GlobalHost.ConnectionManager.GetHubContext<PrincipalHub>())
);
public List<string> ConnectedUsers { get; set; }
private IHubContext _context;
private PrincipalCommunicator(IHubContext context)
{
ConnectedUsers = new List<string>();
_context = context;
}
public static PrincipalCommunicatorInstance
{
get
{
return _instance.Value;
}
}
public bool IsUserConnected(string user)
{
return UsuariosConectados.Contains(user);
}
}
public class PrincipalHub : Hub
{
public override Task OnConnected()
{
PrincipalComunicador.Instance.UsuariosConectados.Add(Context.User.Identity.Name);
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
PrincipalComunicador.Instance.UsuariosConectados.Remove(Context.User.Identity.Name);
return base.OnDisconnected(stopCalled);
}
}
}
通过这种方式,将所有内容发送给客户端的所有逻辑都停留在一个位置like the example,您可以知道用户是否在代码中的任何位置都已连接。