Asp.net 如何在集线器类之外获取信号器用户连接id?

Asp.net 如何在集线器类之外获取信号器用户连接id?,asp.net,ajax,signalr,Asp.net,Ajax,Signalr,我正在ASP.NET web应用程序中使用SignalR。这里,我使用IHubContext从外部调用客户机到中心类。我需要获取当前用户的连接ID,以便仅向当前用户发送消息。如何在客户端获取连接ID?是的。对于.NET客户端,您可以使用$.connection.hub.id,它位于connection对象上,由HubConnection继承 Connection.ConnectionId 因此,通常可以在 hubConnection.ConnectionId 使用下面的代码,它适合我 在hu

我正在ASP.NET web应用程序中使用SignalR。这里,我使用
IHubContext
从外部调用客户机到中心类。我需要获取当前用户的连接ID,以便仅向当前用户发送消息。如何在客户端获取连接ID?

是的。对于.NET客户端,您可以使用
$.connection.hub.id
,它位于
connection
对象上,由
HubConnection
继承

Connection.ConnectionId
因此,通常可以在

hubConnection.ConnectionId

使用下面的代码,它适合我

在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();
    }
  var con = MyHub1.MyUsers;
       var conId =con.Select(s => s.Value).Where(s => s.UserName == User.Identity.Name).FirstOrDefault();
在中心类之外

 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();
    }
  var con = MyHub1.MyUsers;
       var conId =con.Select(s => s.Value).Where(s => s.UserName == User.Identity.Name).FirstOrDefault();

还有另一种方法,您可以通过调用
hub
的方法将连接id从hub获取到控制器中,然后从那里返回所需的
id

控制器代码

var HubContext = GlobalHost.ConnectionManager.GetHubContext<"ChatHub">(); //`ChatHub` can be your Hub Name
ChatHub HubObj= new ChatHub();
var RequiredId= HubObj.InvokeHubMethod();
这对我很有用:

var hub = $.connection.someHub;
// After connection is started
console.log(hub.connection.id);
服务器: Context.ConnectionId =>“dJSbEc73n6YjGIhj-SZz1Q”

客户:

   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

您可以提取id。
(远不是一个完美的解决方案)

要获得完整的集线器url,您可以说:
hubConnection.connection.transport.webSocket.url

这类似于:
“wss://localhost:1234/myHub?id=abcdefg“

要获取ID,请执行以下操作:


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

哦,好的。有没有一种方法可以在客户端获取当前用户的连接id?这在文档中有记载,有些家伙对堆栈溢出太吝啬了。只要给那家伙一个直截了当的回答,不要再让他看文档了。如果你不知道答案,停止回答。这家伙是新手@鲁希拉,谢谢你直截了当的回答。var c_id=$.connection.hub.id;请注意,您必须等待回调:这将返回norhing,但返回一个带有“ConnectionID”的字符串,最好给rod而不是fish:)@BaoucheIqbal,这让我知道了如何调用客户端方法并获取id。如果传输不是websocket怎么办?例如:浏览器不支持websocket,因此传输返回到长轮询?如果传输不是websocket怎么办?例如:浏览器中不支持websocket,因此传输会退回到长轮询?