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 для отслеживания пользователей, и когда вы доберетесь до нуля пользователей, остановите вызов.