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

风格不统一 提交于 2019-12-10 00:36:00

问题


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?


回答1:


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




回答2:


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
}



回答3:


This works for me:

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



回答4:


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)




回答5:


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

Connection.ConnectionId

So typically can be found on

hubConnection.ConnectionId



回答6:


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



回答7:


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]



来源:https://stackoverflow.com/questions/19447974/how-to-get-signalr-user-connection-id-out-side-the-hub-class

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