programing

허브 클래스 외부에서 SignalR 사용자 연결 ID를 가져오려면 어떻게 해야 합니까?

css3 2023. 3. 11. 09:19

허브 클래스 외부에서 SignalR 사용자 연결 ID를 가져오려면 어떻게 해야 합니까?

ASP에서 SignalR을 사용하고 있습니다.NET 웹 어플리케이션여기에서는, 외부로부터 허브 클래스에의 콜을 사용하고 있습니다.IHubContext현재 사용자에게만 메시지를 보내려면 현재 사용자의 연결 ID를 가져와야 합니다.클라이언트측 접속 ID는 어떻게 얻을 수 있나요?

네, 이용하실 수 있습니다.$.connection.hub.id.

.NET Client의 경우 이 클라이언트는Connection오브젝트, 상속자HubConnection.

Connection.ConnectionId

이 때문에, 통상은, 다음의 URL 에 있습니다.

hubConnection.ConnectionId

다른 방법도 있습니다.허브에서 컨트롤러로 접속 ID를 가져오려면hub그리고 당신은 필요한 것을 반환할 수 있습니다.ID거기서부터요.

컨트롤러 코드

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

허브 내부 코드

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

이것으로 충분합니다.

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

Server : 컨텍스트.ConnectionId => "dJSbEc73n6Yj"GIhj-SZ1Q"

클라이언트:

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

=> wss://localhost: 5001/notify?id=dJBEc73n6YJGIhj-SZ1Q

ID를 추출할 수 있습니다(완벽한 솔루션이라고는 할 수 없습니다).

다음 코드를 사용합니다.

허브 클래스입니다.

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

허브 클래스 파일에서 다음 클래스를 만듭니다.

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

}

허브 클래스 밖에 있습니다.

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

완전한 허브 URL을 취득하려면 , 다음과 같이 말할 수 있습니다.hubConnection.connection.transport.webSocket.url

예를 들어 다음과 같습니다."wss://localhost:1234/myHub?id=abcdefg"

ID를 얻으려면 정규식:

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

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