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

edo*_*bry 10 c# asp.net timer signalr signalr-hub

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

cil*_*arl 16

可能最常用的解决方案是保留一个静态变量,其中包含当前连接的用户,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.
}
Run Code Online (Sandbox Code Playgroud)

  • 这不仅不能可靠地工作,因为集线器的寿命模型,它打破了用背板缩小这种情况的可能性.唯一真正的答案是跟踪共享缓存中的在线状态,如redis或appfabric. (8认同)
  • 尝试访问单个资源的多个线程是否存在并发问题? (2认同)

che*_*xis 13

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

var heartBeat = GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>();

var connectionAlive = heartBeat.GetConnections().FirstOrDefault(c=>c.ConnectionId == connection.ConnectionId);

if (connectionAlive.IsAlive)
{
//Do whatever...
}
Run Code Online (Sandbox Code Playgroud)