SignalR-отправка сообщения конкретному пользователю с помощью (IUserIdProvider) *NEW 2.0.0*
в последней версии 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
объятия.
4 ответов:
SignalR предоставляет ConnectionId для каждого соединения. Чтобы найти, какое соединение принадлежит кому (пользователю), нам нужно создать сопоставление между соединением и пользователем. Это зависит от способа идентификации пользователя в приложении.
в SignalR 2.0 это делается с помощью встроенного
IPrincipal.Identity.Name, который является зарегистрированным идентификатором пользователя, установленным во время ASP.NET аутентификация.однако вам может потребоваться сопоставить соединение с пользователем, используя другой идентификатор вместо использования Identity.Name для этой цели этот новый поставщик может быть использован с пользовательской реализацией для сопоставления пользователя с подключением.
пример сопоставления пользователей SignalR с подключениями с помощью IUserIdProvider
предположим, что наше приложение использует
userIdдля идентификации каждого пользователя. Теперь нам нужно отправить сообщение конкретному пользователю. У нас естьuserIdиmessage, но SignalR также должен знать отображение между нашим идентификатором пользователя и соединение.чтобы добиться этого, сначала нам нужно создать новый класс, который реализует
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вместо реализации по умолчанию. Это можно сделать в стартапе.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); } }надеюсь, что это помогает.
вот для начала.. Открыт для предложений/улучшений.
сервер
public class ChatHub : Hub { public void SendChatMessage(string who, string message) { string name = Context.User.Identity.Name; Clients.Group(name).addChatMessage(name, message); Clients.Group("[email protected]").addChatMessage(name, message); } public override Task OnConnected() { string name = Context.User.Identity.Name; Groups.Add(Context.ConnectionId, name); return base.OnConnected(); } }JavaScript
(обратите внимание, как
addChatMessageиsendChatMessageтакже методы в коде сервера выше)$(function () { // Declare a proxy to reference the hub. var chat = $.connection.chatHub; // Create a function that the hub can call to broadcast messages. chat.client.addChatMessage = function (who, message) { // Html encode display name and message. var encodedName = $('<div />').text(who).html(); var encodedMsg = $('<div />').text(message).html(); // Add the message to the page. $('#chat').append('<li><strong>' + encodedName + '</strong>: ' + encodedMsg + '</li>'); }; // Start the connection. $.connection.hub.start().done(function () { $('#sendmessage').click(function () { // Call the Send method on the hub. chat.server.sendChatMessage($('#displayname').val(), $('#message').val()); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); }); });тестирование
посмотреть Тесты SignalR для функции.
тест "SendToUser" автоматически принимает идентификатор пользователя, переданный с помощью обычной библиотеки аутентификации owin.
сценарий заключается в том, что у вас есть пользователь, который подключился с нескольких устройств/браузеров, и вы хотите отправить сообщение всем своим активным соединениям.
вот как использовать SignarR для таргетинга на конкретного пользователя (без использования какого-либо провайдера):
private static ConcurrentDictionary<string, string> clients = new ConcurrentDictionary<string, string>(); public string Login(string username) { clients.TryAdd(Context.ConnectionId, username); return username; } // The variable 'contextIdClient' is equal to Context.ConnectionId of the user, // once logged in. You have to store that 'id' inside a dictionaty for example. Clients.Client(contextIdClient).send("Hello!");

Comments