In der neuesten Version von Asp.Net SignalR wurde eine neue Methode zum Senden einer Nachricht an einen bestimmten Benutzer über die Schnittstelle "IUserIdProvider" hinzugefügt.
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 lautet: Woher weiß ich, an wen ich meine Nachricht sende? Die Erklärung dieser neuen Methode ist sehr oberflächlich. Und der Entwurf der Anweisung von SignalR 2.0.0 mit diesem Fehler und nicht kompiliert. Hat jemand diese Funktion implementiert?
Weitere Informationen: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider
Umarmungen.
Antworten:
SignalR stellt für jede Verbindung die Verbindungs-ID bereit. Um herauszufinden, welche Verbindung zu wem (dem Benutzer) gehört, 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 der eingebauten
IPrincipal.Identity.Name
Benutzerkennung, die während der ASP.NET-Authentifizierung festgelegt wurde.Möglicherweise müssen Sie jedoch die Verbindung mit dem Benutzer mithilfe eines anderen Bezeichners zuordnen, anstatt den Identity.Name zu verwenden. Zu diesem Zweck kann dieser neue Anbieter mit Ihrer benutzerdefinierten Implementierung zum Zuordnen von Benutzern zur Verbindung verwendet werden.
Beispiel für die Zuordnung von SignalR-Benutzern zu Verbindungen mithilfe von IUserIdProvider
Nehmen wir an, unsere Anwendung verwendet a
userId
, um jeden Benutzer zu identifizieren. Jetzt müssen wir eine Nachricht an einen bestimmten Benutzer senden. Wir habenuserId
undmessage
, aber SignalR muss auch die Zuordnung zwischen unserer Benutzer-ID und der Verbindung kennen.Um dies zu erreichen, müssen wir zuerst eine neue Klasse erstellen, die Folgendes implementiert
IUserIdProvider
:Der zweite Schritt besteht darin, SignalR anzuweisen, unsere
CustomUserIdProvider
anstelle der Standardimplementierung zu verwenden. Dies kann in der Datei Startup.cs erfolgen, während die Hub-Konfiguration initialisiert wird:Jetzt können Sie eine Nachricht an einen bestimmten Benutzer senden, indem Sie dessen
userId
wie in der Dokumentation beschrieben verwenden, z.Hoffe das hilft.
quelle
app.MapSignalR();
global.asax vor der Authentifizierung eingegeben habe.Hier ist ein Anfang. Offen für Vorschläge / Verbesserungen.
Server
JavaScript
(Beachten Sie, wie
addChatMessage
undsendChatMessage
sind auch Methoden im obigen Servercode)Testen
quelle
So verwenden Sie SignarR, um einen bestimmten Benutzer anzusprechen (ohne einen Anbieter zu verwenden):
quelle
contextIdClient
verwenden, haben Sie nicht verstanden :(Schauen Sie sich SignalR-Tests für die Funktion an.
Test "SendToUser" verwendet automatisch die Benutzeridentität, die mithilfe einer regulären Owin-Authentifizierungsbibliothek übergeben wurde.
Das Szenario besteht darin, dass Sie einen Benutzer haben, der über mehrere Geräte / Browser eine Verbindung hergestellt hat, und eine Nachricht an alle seine aktiven Verbindungen senden möchten.
quelle
Alter Thread, aber gerade in einem Beispiel darauf gestoßen:
quelle