SignalR-проверка подключения пользователя

У меня есть концентратор с методом, который называется клиентской стороной. Этот метод запускает таймер с делегатом, который выполняется каждые 10 секунд. Поскольку не имеет смысла продолжать запускать этот делегат, если никто не подключен к концентратору, я хочу проверить, подключены ли какие-либо пользователи изнутри делегата, прежде чем я перенесу его. Есть ли способ сделать это?

3 ответов


вероятно, наиболее часто используемым решением является сохранение статической переменной, содержащей подключенных пользователей и переопределение 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)
    {
        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");

таким образом, вы должны иметь возможность получить контекст.Клиенты.Рассчитывать.

этот пост также ссылается на wiki, который имеет много хорошей информации. Вы можете попробовать использовать примеры OnConnected/OnDisconnected для отслеживания пользователей, и когда вы доберетесь до нуля пользователей, остановите вызов.