В последней версии Asp.Net SignalR был добавлен новый способ отправки сообщения конкретному пользователю с использованием интерфейса «IUserIdProvider».
public interface IUserIdProvider
{
string GetUserId(IRequest request);
}
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Мой вопрос: как мне узнать, кому я отправляю свое сообщение? Объяснение этого нового метода очень поверхностное. И проект Заявления SignalR 2.0.0 с этой ошибкой так и не компилируется. Кто-нибудь реализовал эту функцию?
Дополнительная информация: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider
Объятия.
Ответы:
SignalR предоставляет ConnectionId для каждого соединения. Чтобы определить, какое соединение кому принадлежит (пользователю), нам нужно создать сопоставление между соединением и пользователем. Это зависит от того, как вы идентифицируете пользователя в своем приложении.
В SignalR 2.0 это делается с помощью встроенного
IPrincipal.Identity.Name
идентификатора зарегистрированного пользователя, установленного во время проверки подлинности ASP.NET.Однако вам может потребоваться сопоставить соединение с пользователем с использованием другого идентификатора вместо использования Identity.Name. Для этой цели этот новый поставщик может использоваться с вашей собственной реализацией для сопоставления пользователя с подключением.
Пример сопоставления пользователей SignalR с подключениями с помощью IUserIdProvider
Предположим, наше приложение использует
userId
для идентификации каждого пользователя. Теперь нам нужно отправить сообщение конкретному пользователю. У нас естьuserId
иmessage
, но SignalR также должен знать соответствие между нашим идентификатором пользователя и соединением.Для этого сначала нам нужно создать новый класс, который реализует
IUserIdProvider
:Второй шаг - указать SignalR использовать нашу реализацию
CustomUserIdProvider
вместо реализации по умолчанию. Это можно сделать в Startup.cs при инициализации конфигурации хаба:Теперь вы можете отправить сообщение конкретному пользователю, используя его,
userId
как указано в документации, например:Надеюсь это поможет.
источник
app.MapSignalR();
global.asax перед аутентификацией.Вот и начало .. Открыт для предложений / улучшений.
Сервер
JavaScript
(Обратите внимание, как
addChatMessage
иsendChatMessage
также являются методами в коде сервера выше)Тестирование
источник
Вот как использовать SignarR для нацеливания на конкретного пользователя (без использования какого-либо поставщика):
источник
contextIdClient
неПосмотрите тесты SignalR для этой функции.
Тест «SendToUser» автоматически принимает идентификатор пользователя, переданный с помощью обычной библиотеки аутентификации owin.
Сценарий состоит в том, что у вас есть пользователь, который подключился с нескольких устройств / браузеров, и вы хотите отправить сообщение всем его активным подключениям.
источник
Старый поток, но только что наткнулся на это в образце:
источник
Для всех, кто пытается сделать это в ядре asp.net. Вы можете использовать претензии.
Можно использовать любой идентификатор, но он должен быть уникальным. Например, если вы используете идентификатор имени, это означает, что если есть несколько пользователей с тем же именем, что и получатель, сообщение будет доставлено и им. Я выбрал электронную почту, потому что она уникальна для каждого пользователя.
Затем зарегистрируйте службу в классе запуска.
Следующий. Добавляйте претензии при регистрации пользователя.
Отправить сообщение конкретному пользователю.
Примечание. Отправитель сообщения не получит уведомления об отправке сообщения. Если вы хотите уведомление на стороне отправителя. Измените
SendMessage
метод на этот.Эти шаги необходимы только в том случае, если вам нужно изменить идентификатор по умолчанию. В противном случае перейдите к последнему шагу, где вы можете просто отправлять сообщения, передавая userIds или connectionIds в
SendMessage
. Для большегоисточник