SignalR забезпечує ConnectionId для кожного з'єднання. Щоб знайти, яке з'єднання належить кому (користувачеві), нам потрібно створити відображення між з'єднанням і користувачем. Це залежить від того, як ви ідентифікуєте користувача у вашій програмі.
У SignalR 2.0 це робиться за допомогою вбудованого IPrincipal.Identity.Name
, який входить до ідентифікатора користувача, встановленого під час автентифікації ASP.NET.
Однак вам може знадобитися зіставити з'єднання з користувачем, використовуючи інший ідентифікатор замість Identity.Name. Для цього цей новий провайдер може використовуватися з вашою спеціальною реалізацією для зіставлення користувача з підключенням.
Приклад відображення користувачів SignalR до з'єднань за допомогою IUserIdProvider
Давайте припустимо, що наша програма використовує userId
для ідентифікації кожного користувача. Тепер нам потрібно надіслати повідомлення конкретному користувачеві. У нас є userId
і message
, але SignalR також повинні знати відповідність між нашою USERID і зв'язку.
Для цього нам спочатку потрібно створити новий клас, який реалізує 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();
}
}
Другий крок - сказати SignalR використовувати наш CustomUserIdProvider
замість реалізації за замовчуванням. Це можна зробити в Startup.cs під час ініціалізації конфігурації концентратора:
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();
}
}
Тепер ви можете надіслати повідомлення певному користувачеві, використовуючи його, userId
як зазначено в документації, наприклад:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Сподіваюся, це допомагає.