J'utilise SignalR dans mon application Web ASP.NET. Ici, j'appelle le client de l'extérieur vers la classe de concentrateur en utilisant IHubContext
. Je dois obtenir l'ID de connexion de l'utilisateur actuel pour pouvoir envoyer des messages à l'utilisateur actuel uniquement. Comment puis-je obtenir l'ID de connexion côté client?
Oui. Vous pouvez utiliser $.connection.hub.id
.
Il existe un autre moyen également, vous pouvez obtenir un identifiant de connexion dans votre contrôleur depuis un concentrateur en invoquant une méthode de hub
. Vous pouvez également renvoyer la ID
requise.
Code du contrôleur
var HubContext = GlobalHost.ConnectionManager.GetHubContext<"ChatHub">(); //`ChatHub` can be your Hub Name
ChatHub HubObj= new ChatHub();
var RequiredId= HubObj.InvokeHubMethod();
Code dans le hub
public string InvokeHubMethod()
{
return "ConnectionID" //ConnectionID will the Id as string that you want outside the hub
}
Cela fonctionne pour moi:
var hub = $.connection.someHub;
// After connection is started
console.log(hub.connection.id);
Serveur: Context.ConnectionId => "DJSbEc73n6YjGIhj-SZz1Q"
Client :
this._hubConnection
.start()
.then(() => {
var hub = this._hubConnection ;
var connectionUrl = hub["connection"].transport.webSocket.url ;
console.log(connectionUrl);
=> wss: // hôte local: 5001/notify? id = dJSbEc73n6YjGIhj-SZz1Q
vous pouvez extraire l'id . (loin d'être une solution parfaite)
Pour un client .NET, il se trouve sur l'objet Connection
, hérité de HubConnection
.
Connection.ConnectionId
Si généralement peut être trouvé sur
hubConnection.ConnectionId
utilisez le code suivant cela fonctionne pour moi.
dans la classe hub.
public static ConcurrentDictionary<string, MyUserType> MyUsers = new ConcurrentDictionary<string, MyUserType>();
public override Task OnConnected()
{
MyUsers.TryAdd(Context.User.Identity.Name, new MyUserType() { ConnectionId = Context.ConnectionId,UserName=Context.User.Identity.Name });
string name = Context.User.Identity.Name;
Groups.Add(Context.ConnectionId, name);
return base.OnConnected();
}
dans le fichier de classe hub créer la classe suivante
public class MyUserType
{
public string ConnectionId { get; set; }
public string UserName { get; set; }
}
et en dehors de la classe de hub.
var con = MyHub1.MyUsers;
var conId =con.Select(s => s.Value).Where(s => s.UserName == User.Identity.Name).FirstOrDefault();
Pour obtenir l'URL complète du hub, vous pouvez dire: hubConnection.connection.transport.webSocket.url
c'est quelque chose comme: "wss://localhost:1234/myHub?id=abcdefg"
Regex pour obtenir l'ID:
var r = /.*\=(.*)/
var id = r.exec(url)[1]