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

只愿长相守 提交于 2019-12-04 22:15:44
Ruchira

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]

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!