2012-12-03 14 views
8

Mam koncentrator z metodą o nazwie po stronie klienta. Ta metoda uruchamia zegar z delegatem, który działa co 10 sekund. Ponieważ nie ma sensu utrzymywać tego delegata, jeśli nikt nie jest podłączony do koncentratora, chcę sprawdzić, czy wszyscy użytkownicy są nadal połączeni z wewnątrz delegata, zanim przełożę go ponownie. Czy jest jakiś sposób to zrobić?SignalR - Sprawdzanie, czy użytkownik jest nadal podłączony

Odpowiedz

16

Prawdopodobnie najczęściej używanym rozwiązaniem jest utrzymanie zmienną statyczną zawierającą użytkowników aktualnie podłączonych i nadrzędne OnConnect i OnDisconnect lub wykonawczych IDisconnect w zależności od wersji, którego używasz.

byłoby zaimplementować coś takiego:

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. 
} 
+0

Widziałem to w innych miejscach, po prostu liczyłem na lepszy sposób. Dzięki, spróbuję tego! – edobry

+2

Czy są jakieś problemy dotyczące współbieżności z wieloma wątkami próbującymi uzyskać dostęp do pojedynczego zasobu? –

+3

To nie tylko nie zadziała niezawodnie, ponieważ trwający model koncentratora, przełamuje możliwość skalowania go za pomocą płyty montażowej. Jedyną prawdziwą odpowiedzią jest śledzenie statusu online we współdzielonej pamięci podręcznej, np. Redis lub appfabric. – Bon

1

Od 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"); 

więc powinieneś być w stanie uzyskać context.Clients.Count.

Ten wpis odwołuje się także do wiki, który ma wiele dobrych informacji. Możesz spróbować użyć przykładów OnConnected/OnDisconnected do śledzenia użytkowników, a gdy dojdziesz do zera, zatrzymaj połączenie.

+0

Dzięki za sugestię, ale staram się robić to z wewnątrz koncentratora ... czy nadal będzie działać? – edobry

10

Jeśli zapiszesz ConnectionId w swojej bazie danych, można to sprawdzić:

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

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

if (connectionAlive.IsAlive) 
{ 
//Do whatever... 
} 
+1

Musisz dodać 'using Microsoft.AspNet.SignalR.Transports' –

+0

Też nie powinno to. Transport jest w Zgromadzeniu Głównym ... Bummer! Zobacz: https://msdn.microsoft.com/en-us/library/microsoft.aspnet.signalr.transports.transportmanager%28v=vs.118%29.aspx?f=255&MSPPError=-2147217396 –

Powiązane problemy