2012-11-22 9 views
33

Czy istnieje sposób, aby dowiedzieć się liczbę słuchaczy (klienci podłączony do koncentratora?)Get liczbę słuchaczy, klientów podłączonych do SignalR piasty

próbuję uruchomić/rozpocząć zadanie, jeśli co najmniej jeden klient jest podłączony, w przeciwnym razie nie go uruchomić:

[HubName("taskActionStatus")] 
public class TaskActionStatus : Hub, IDisconnect 
{ 
    static CancellationTokenSource tokenSource; 

    public void GetTasksStatus(int? siteId) 
    { 
     tokenSource = new CancellationTokenSource(); 
     CancellationToken ct = tokenSource.Token; 

     ITaskRepository taskRepository = UnityContainerSetup.Container.Resolve<ITaskRepository>(); 

     // init task for checking task statuses 
     var tasksItem = new DownloadTaskItem(); 
     taskRepository.GetTasksStatusAsync(siteId, tasksItem, ct); 

     // subscribe to event [ listener ] 
     tasksItem.Changed += new EventHandler<TaskEventArgs>(UpdateTasksStatus); 
    } 

    public void UpdateTasksStatus(object sender, TaskEventArgs e) 
    { 
     Clients.updateMessages(e.Tasks); 
    } 

    // when browsing away from page 
    public Task Disconnect() 
    { 
     try 
     { 
      tokenSource.Cancel(); 
     } 
     catch (Exception) 
     { 
      // 
     } 

     return null; 
    } 
} 

dzięki

Odpowiedz

60

nie ma sposobu, aby pozbyć się tego liczyć od SignalR jako takie. Musisz używać metod w Hubie, aby zachować liczbę samemu.

Prosty przykład z klasą statyczną trzymać Count:

public static class UserHandler 
{ 
    public static HashSet<string> ConnectedIds = new HashSet<string>(); 
} 

public class MyHub : Hub 
{ 
    public override Task OnConnected() 
    { 
     UserHandler.ConnectedIds.Add(Context.ConnectionId); 
     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     UserHandler.ConnectedIds.Remove(Context.ConnectionId); 
     return base.OnDisconnected(); 
    } 
} 

wtedy uzyskać zliczania z UserHandler.ConnectedIds.Count.

+0

masz przykład hos ten jest używany? czy zachowałbym tę listę w sesji? – ShaneKm

+0

Zazwyczaj najlepiej jest utrzymywać liczbę na serwerze w pewnym typie magazynu danych (prawdopodobnie tylko w klasie statycznej). Mogę przedstawić rozwiązanie w mojej odpowiedzi, daj mi minutę ... –

+5

+1 pamiętaj tylko o restarcie domeny aplikacji, że obiekt zostanie zresetowany; powinieneś rozważyć utrzymanie tego obiektu w pewnym momencie; Zwykle robię to za każdym razem, gdy ktoś zostanie dodany lub usunięty. – f0x

22

Dla wersji 2.1.1+ powinno być:

public static class UserHandler 
{ 
    public static HashSet<string> ConnectedIds = new HashSet<string>(); 
} 

public class MyHub : Hub 
{ 
    public override Task OnConnected() 
    { 
     UserHandler.ConnectedIds.Add(Context.ConnectionId); 
     return base.OnConnected(); 
    } 

    public override Task OnDisconnected(bool stopCalled) 
    { 
     UserHandler.ConnectedIds.Remove(Context.ConnectionId); 
     return base.OnDisconnected(stopCalled); 
    } 
} 
+1

Zachowaj ostrożność w przypadku odłamania serwera. Wolisz używać Cache lub Db do przechowywania twoich kantorów. – Nigrimmist

Powiązane problemy