web-dev-qa-db-fra.com

comment obtenir l'identifiant de connexion de l'utilisateur SignalR en dehors de la classe hub?

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?

28
selvakumar

Oui. Vous pouvez utiliser $.connection.hub.id.

49
Ruchira

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
}
3
Rushik

Cela fonctionne pour moi: 

var hub = $.connection.someHub;
// After connection is started
console.log(hub.connection.id);
2
Marc

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)

1
user2748273

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
0
Simon_Weaver

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();
0
saad elshazly

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]

0
Jared Beach