Dans la dernière version d'Asp.Net SignalR, a été ajoutée une nouvelle façon d'envoyer un message à un utilisateur spécifique, en utilisant l'interface "IUserIdProvider".
public interface IUserIdProvider
{
string GetUserId(IRequest request);
}
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Ma question est la suivante: comment savoir à qui j'envoie mon message? L'explication de cette nouvelle méthode est très superficielle. Et le projet de déclaration de SignalR 2.0.0 avec ce bogue et ne compile pas. Quelqu'un a-t-il implémenté cette fonctionnalité?
Plus d'informations: http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider
Câlins.
Réponses:
SignalR fournit ConnectionId pour chaque connexion. Pour trouver quelle connexion appartient à qui (l'utilisateur), nous devons créer un mappage entre la connexion et l'utilisateur. Cela dépend de la manière dont vous identifiez un utilisateur dans votre application.
Dans SignalR 2.0, cela se fait à l'aide de la fonction intégrée
IPrincipal.Identity.Name
, qui est l'identificateur de l'utilisateur connecté tel que défini lors de l'authentification ASP.NET.Cependant, vous devrez peut-être mapper la connexion avec l'utilisateur à l'aide d'un identificateur différent au lieu d'utiliser Identity.Name. À cette fin, ce nouveau fournisseur peut être utilisé avec votre implémentation personnalisée pour mapper l'utilisateur avec la connexion.
Exemple de mappage d'utilisateurs SignalR à des connexions à l'aide de IUserIdProvider
Supposons que notre application utilise un
userId
pour identifier chaque utilisateur. Maintenant, nous devons envoyer un message à un utilisateur spécifique. Nous avonsuserId
etmessage
, mais SignalR doit également connaître le mappage entre notre userId et la connexion.Pour y parvenir, nous devons d'abord créer une nouvelle classe qui implémente
IUserIdProvider
:La deuxième étape consiste à indiquer à SignalR d'utiliser notre
CustomUserIdProvider
au lieu de l'implémentation par défaut. Cela peut être fait dans Startup.cs lors de l'initialisation de la configuration du concentrateur:Maintenant, vous pouvez envoyer un message à un utilisateur spécifique en utilisant le sien
userId
comme mentionné dans la documentation, comme:J'espère que cela t'aides.
la source
app.MapSignalR();
global.asax avant l'authentification.Voici un début .. Ouvert aux suggestions / améliorations.
Serveur
JavaScript
(Notez comment
addChatMessage
etsendChatMessage
sont également des méthodes dans le code serveur ci-dessus)Essai
la source
Voici comment utiliser SignarR pour cibler un utilisateur spécifique (sans utiliser de fournisseur):
la source
contextIdClient
pas compris :(Regardez les tests SignalR pour la fonctionnalité.
Le test "SendToUser" prend automatiquement l'identité de l'utilisateur transmise à l'aide d'une bibliothèque d'authentification owin standard.
Le scénario est que vous avez un utilisateur qui s'est connecté à partir de plusieurs appareils / navigateurs et que vous souhaitez envoyer un message à toutes ses connexions actives.
la source
Ancien fil, mais je suis juste tombé sur ceci dans un exemple:
la source