SignalR zapewnia ConnectionId dla każdego połączenia. Aby dowiedzieć się, które połączenie należy do kogo (użytkownika), musimy utworzyć mapowanie między połączeniem a użytkownikiem. Zależy to od tego, jak identyfikujesz użytkownika w swojej aplikacji.
W SignalR 2,0 odbywa się to przy użyciu wbudowanego IPrincipal.Identity.Name, czyli identyfikatora zalogowanego użytkownika ustawionego podczas uwierzytelniania ASP.NET.
Jednak może być konieczne zmapowanie połączenia z użytkownikiem przy użyciu innego identyfikatora zamiast używania Identity.Name. W tym celu ten nowy dostawca może być używany z niestandardową implementacją do mapowania użytkownika z połączeniem.
Przykład mapowania użytkowników sygnalizujących na połączenia przy użyciu IUserIdProvider
Załóżmy, że nasza aplikacja używa znaku userIddo identyfikacji każdego użytkownika. Teraz musimy wysłać wiadomość do konkretnego użytkownika. Mamy userIdi message, ale SignalR musi również znać mapowanie między naszym userId a połączeniem.
Aby to osiągnąć, najpierw musimy stworzyć nową klasę, która implementuje IUserIdProvider:
public class CustomUserIdProvider : IUserIdProvider
{
public string GetUserId(IRequest request)
{
// your logic to fetch a user identifier goes here.
// for example:
var userId = MyCustomUserClass.FindUserId(request.User.Identity.Name);
return userId.ToString();
}
}
Drugim krokiem jest poinformowanie sygnalizującego, aby używał naszej CustomUserIdProviderzamiast domyślnej implementacji. Można to zrobić w pliku Startup.cs podczas inicjowania konfiguracji koncentratora:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var idProvider = new CustomUserIdProvider();
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);
// Any connection or hub wire up and configuration should go here
app.MapSignalR();
}
}
Teraz możesz wysłać wiadomość do określonego użytkownika, używając jego, userIdjak wspomniano w dokumentacji, na przykład:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Mam nadzieję że to pomoże.