SignalR – Senden einer Nachricht an einen bestimmten Benutzer mit (IUserIdProvider) * NEW 2.0.0 *

In der neuesten Version von Asp.Net SignalR wurde eine neue Möglichkeit hinzugefügt, eine Nachricht über die Schnittstelle “IUserIdProvider” an einen bestimmten Benutzer zu senden.

public interface IUserIdProvider { string GetUserId(IRequest request); } public class MyHub : Hub { public void Send(string userId, string message) { Clients.User(userId).send(message); } } 

Meine Frage ist: Woher weiß ich, an wen ich meine Nachricht sende? Die Erklärung dieser neuen Methode ist sehr oberflächlich. Und der Entwurf Statement of SignalR 2.0.0 mit diesem Fehler und kompiliert nicht. Hat jemand diese function implementiert?

Weitere Informationen: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider

Umarmungen.

Solutions Collecting From Web of "SignalR – Senden einer Nachricht an einen bestimmten Benutzer mit (IUserIdProvider) * NEW 2.0.0 *"

SignalR stellt ConnectionId für jede Verbindung bereit. Um herauszufinden, welche Verbindung zu wem gehört (der Benutzer), müssen wir eine Zuordnung zwischen der Verbindung und dem Benutzer erstellen. Dies hängt davon ab, wie Sie einen Benutzer in Ihrer Anwendung identifizieren.

In SignalR 2.0 erfolgt dies mithilfe des integrierten IPrincipal.Identity.Name , bei dem es sich um die bei der ASP.NET-Authentifizierung festgelegte Benutzer-ID IPrincipal.Identity.Name .

Möglicherweise müssen Sie jedoch die Verbindung mit dem Benutzer mithilfe einer anderen Kennung zuordnen, anstatt Identity.Name zu verwenden. Zu diesem Zweck kann dieser neue Provider mit Ihrer benutzerdefinierten Implementierung für die Zuordnung von Benutzern mit der Verbindung verwendet werden.

Beispiel für das Zuordnen von SignalR-Benutzern zu Verbindungen mit IUserIdProvider

Nehmen wir an, unsere Anwendung verwendet eine userId , um jeden Benutzer zu identifizieren. Jetzt müssen wir eine Nachricht an einen bestimmten Benutzer senden. Wir haben userId und message , aber SignalR muss auch die Zuordnung zwischen unserer userId und der Verbindung kennen.

Um dies zu erreichen, müssen wir zuerst eine neue class erstellen, die IUserIdProvider implementiert:

 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(); } } 

Der zweite Schritt besteht darin, SignalR anzuweisen, unseren CustomUserIdProvider anstelle der Standardimplementierung zu verwenden. Dies kann in der Startup.cs beim Initialisieren der Hub-Konfiguration erfolgen:

 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(); } } 

Jetzt können Sie Nachrichten an einen bestimmten Benutzer senden, indem Sie seine userId wie in der Dokumentation erwähnt:

 public class MyHub : Hub { public void Send(string userId, string message) { Clients.User(userId).send(message); } } 

Hoffe das hilft.

Hier ist ein Anfang .. Offen für Vorschläge / Verbesserungen.

Server

 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("2@2.com").addChatMessage(name, message); } public override Task OnConnected() { string name = Context.User.Identity.Name; Groups.Add(Context.ConnectionId, name); return base.OnConnected(); } } 

JavaScript

(Beachten Sie, dass addChatMessage und sendChatMessage auch Methoden im obigen Server-Code sind)

  $(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 = $('
').text(who).html(); var encodedMsg = $('
').text(message).html(); // Add the message to the page. $('#chat').append('
  • ' + encodedName + ':  ' + encodedMsg + '
  • '); }; // 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(); }); }); });

    Testen Bildbeschreibung hier eingeben

    Sehen Sie sich SignalR Tests für die function an.

    Der Test “SendToUser” nimmt automatisch die Benutzeridentität an, die mit einer regulären owin-Authentifizierungsbibliothek übergeben wurde.

    In diesem Szenario haben Sie einen Benutzer, der von mehreren Geräten / Browsern aus eine Verbindung hergestellt hat und eine Nachricht an alle seine aktiven Verbindungen senden möchte.

    So verwenden Sie SignarR, um einen bestimmten Benutzer anzusprechen (ohne einen Provider zu verwenden):

      private static ConcurrentDictionary clients = new ConcurrentDictionary(); 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!");