Я использую SignalR в моем веб-приложении ASP.NET. Здесь я IHubContext
клиента извне в класс-концентратор, используя IHubContext
. Мне нужно получить идентификатор текущего подключения пользователя, чтобы отправлять сообщения только текущему пользователю. Как я могу получить идентификатор соединения?
Как получить идентификатор подключения пользователя SignalR вне класса хаба?
Ответ 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]