简体   繁体   中英

how to get SignalR user connection id out side the hub class?

I am using SignalR in my ASP.NET web application. Here I am calling client from outside to hub class using IHubContext . I need to get the current user's connection ID in order to send messages to the current user only. How can I get the connection ID on the client side?

Yep. You can use $.connection.hub.id .

There's another way also, you can get connection id into your controller from hub by invoking a method of hub and you can return the required ID from there.

Controller Code

var HubContext = GlobalHost.ConnectionManager.GetHubContext<"ChatHub">(); //`ChatHub` can be your Hub Name
ChatHub HubObj= new ChatHub();
var RequiredId= HubObj.InvokeHubMethod();

Code inside Hub

public string InvokeHubMethod()
{
     return "ConnectionID"  //ConnectionID will the Id as string that you want outside the hub
}

This works for me:

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

Server : Context.ConnectionId => "dJSbEc73n6YjGIhj-SZz1Q"

Client :

   this._hubConnection
      .start()
      .then(() => {     
         var hub = this._hubConnection ;
         var connectionUrl = hub["connection"].transport.webSocket.url ;
         console.log(connectionUrl);

=> wss://localhost:5001/notify?id=dJSbEc73n6YjGIhj-SZz1Q

you can extract the id. (far to be a perfect solution)

For a .NET Client it is on the Connection object, inherited by HubConnection .

Connection.ConnectionId

So typically can be found on

hubConnection.ConnectionId

use the following code it works for me.

in the hub class.

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

in the hub class file create the following class

public class MyUserType
{
    public string ConnectionId { get; set; }
    public string UserName { get; set; }

}

and outside the hub class.

  var con = MyHub1.MyUsers;
       var conId =con.Select(s => s.Value).Where(s => s.UserName == User.Identity.Name).FirstOrDefault();

To get the full hub url, you can say: hubConnection.connection.transport.webSocket.url

this is something like: "wss://localhost:1234/myHub?id=abcdefg"

Regex to get the ID:

var r = /.*\\=(.*)/ var id = r.exec(url)[1]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM