2012-03-07 13 views
18

Chcę mieć możliwość wysyłania do siebie wiadomości przez poszczególnych użytkowników za pomocą SignalR, dlatego muszę wysłać do określonego ID klienta. Jak zdefiniować identyfikator klienta dla określonego użytkownika na początku sesji - powiedz klucz podstawowy GUID dla użytkownika?SignalR - Ustaw ClientID ręcznie

Odpowiedz

23

Wymień IConnectionIdFactory na własny https://github.com/SignalR/SignalR/wiki/Extensibility.

wykorzystanie próbki: http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/

EDIT: To nie jest już obsługiwana w najnowszych wersjach SignalR. Ale można określić identyfikator użytkownika dla określonego połączenia przy użyciu nowego IUserIdProvider

+0

Doskonały - dzięki za odpowiedź i link do bloga! – reach4thelasers

+2

Czy istnieje sposób ręcznego ustawienia identyfikatora klienta bez używania plików cookie? być może parametr metody startowej() lub inny sposób przekazywania informacji do obiektu żądania w fabryce połączeń niestandardowych? –

+1

Dzięki za link do mojego bloga! – 1kevgriff

3

SignalR Client Side documentation przedstawia następujące:

connection.id - Pobiera lub ustawia identyfikator klienta dla bieżącego połączenia

To z pewnością oznacza, że ​​powinno być możliwe ustawienie klienta clientID, bez całej powyższej instalacji hydraulicznej. Czy to nie działa? Jeśli działa, jak by wyglądała ta linia kodu?

+0

Nie próbowałem tego, ale muszę mieć możliwość przypisania identyfikatora połączenia do czegoś znanego na serwerze, takiego jak identyfikator GUID (identyfikator użytkownika), więc rozwiązanie IConnectionFactory działa najlepiej dla mnie. – reach4thelasers

+0

+1 za podniesienie tego numeru – reach4thelasers

5

W aplikacji SignalR w wersji 1, używając metody Hubs, nadpisuję metodę Hub OnConnected() i zapisuję powiązanie identyfikatora użytkownika .NET z bieżącym identyfikatorem połączenia (Context.ConnectionId) w bazie danych SQL.

Następnie przesłonię metodę Hub OnDisconnected() i usuwam powiązanie między identyfikatorem użytkownika .NET a bieżącym identyfikatorem połączenia. Oznacza to, że po ponownym załadowaniu strony połączenie userId/connectionId będzie aktualne.

Coś wzdłuż linii:

public class MyHub : Hub 
{ 
    private MembershipUser _user 
    { 
     get { return Membership.GetUser(); } 
    } 

    private Guid _userId 
    { 
     get { return (Guid) _user.ProviderUserKey; } 
    } 

    private Guid _connectionId 
    { 
     get { return Guid.Parse(Context.ConnectionId); } 
    } 

    public override Task OnConnected() 
    { 
     var userConnectionRepository = new UserConnectionRepository(); 
     userConnectionRepository.Create(_userId, _connectionId); 
     userConnectionRepository.Submit(); 

     return base.OnConnected(); 
    } 

    public override Task OnDisconnected() 
    { 
     var userConnectionRepository = new UserConnectionRepository(); 
     userConnectionRepository.Delete(_userId, _connectionId); 
     userConnectionRepository.Submit(); 

     return base.OnDisconnected(); 
    } 
} 

Potem, gdy muszę wywołać zdarzenie SignalR dla konkretnego użytkownika, mogę wypracować ConnectionId ze stowarzyszenia (ów) bazy danych z aktualnym użytkownikiem - nie może być więcej niż jedno powiązanie, jeśli zaangażowanych jest wiele instancji przeglądarki.

+0

Czy masz przykład tego? – CR41G14

+0

Zaktualizowałem swoją odpowiedź na przykładzie –