17

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

4

4 回答 4

18

可能最常用的解决方案是保留一个静态变量,其中包含当前连接的用户,并根据您使用的版本覆盖OnConnectOnDisconnect/或实施。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.
}
于 2012-12-03T21:37:04.533 回答
17

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

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

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

if (connectionAlive.IsAlive)
{
//Do whatever...
}
于 2015-11-18T12:28:43.550 回答
1

来自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 示例来跟踪用户,当您达到零用户时停止您的呼叫。

于 2012-12-03T21:36:29.357 回答
1

我已经这样做了:

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);
        }
    }
}

这样,向客户端发送内容的所有逻辑都保留在一个位置,就像示例一样,您可以知道用户是否连接到代码中的任何位置。

于 2019-11-10T04:23:40.723 回答