Подтвердить что ты не робот

Как получить идентификатор подключения пользователя SignalR вне класса хаба?

Я использую SignalR в моем веб-приложении ASP.NET. Здесь я IHubContext клиента извне в класс-концентратор, используя IHubContext. Мне нужно получить идентификатор текущего подключения пользователя, чтобы отправлять сообщения только текущему пользователю. Как я могу получить идентификатор соединения?

4b9b3361

Ответ 1

Ага. Вы можете использовать $.connection.hub.id.

Ответ 2

Иными словами, вы можете получить идентификатор соединения в своем контроллере из концентратора, вызвав метод 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
}

Ответ 3

Это работает для меня:

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

Ответ 4

Сервер: 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

Вы можете извлечь идентификатор. (далеко не идеальное решение)

Ответ 5

Для .NET-клиента он находится в объекте Connection, унаследованном HubConnection.

Connection.ConnectionId

Так обычно можно найти на

hubConnection.ConnectionId

Ответ 6

используйте следующий код, который он работает для меня.

в классе концентратора.

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

Ответ 7

Чтобы получить полный URL-адрес концентратора, вы можете сказать: hubConnection.connection.transport.webSocket.url

это что-то вроде: "wss://localhost:1234/myHub?id=abcdefg"

Regex, чтобы получить идентификатор:

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