Получение идентификатора соединения SignalR для вызовов веб-API - PullRequest
2 голосов
/ 18 апреля 2019

У меня есть следующее созвездие:

Я использую основной веб-API-проект asp.net, который также включает HubContext.Первое, что пользователь должен сделать, это сделать вызов API на мой UsersController : BaseController.Здесь он / она вызывает маршрут api/login, передавая соответствующие учетные данные.Возвращаемым значением функции Login() является JwtBearerToken, который пользователь с тех пор использует для всех других вызовов API.

Как только токен был выдан, пользователь (Клиент) устанавливает соединение SignalR через мой ConnectionHub : Hub.

Пока все работает хорошо, пользователь проходит аутентификацию с использованием токена при вызове API.методы, и я также могу отслеживать соответствующее состояние сеанса внутри области моего ConnectionHub.

Теперь я должен получать идентификатор сеанса пользователей (SignalR) всякий раз, когда он / она делает вызов API.

т.е. когда пользователь вызывает метод в моем UsersController, я хочу сделать что-то вроде этого:


[HttpGet]
public ActionResult<List<User>> GetAll()
{
    // Here I want to retrieve the (SignalR) session id of the user calling this method.
    return Ok( userRepository.GetAllUsers() );
}

Пока единственная идея, которую я имею, состоит в том, чтобы заставить пользователя отправить свой SignalR-SessionId св соответствии с вызовом API, но то, что я хотел бы добиться, это прочитать идентификатор на стороне сервера.Как мне этого добиться?

1 Ответ

0 голосов
/ 18 апреля 2019

Согласно документации Microsoft , невозможно получить connectionId пользователя вне концентратора (например, в контроллере):

При вызове методов концентратораснаружи класса Hub нет вызывающей стороны, связанной с вызовом.Поэтому нет доступа к свойствам ConnectionId, Caller и Others.


Однако вы можете получить пользователей с помощью JavaScript, вызвав метод-концентратор.Здесь у вас есть доступ к connectionId и к базе данных с помощью вашего репозитория (убедитесь, что он доступен через Dependency Injection).

Я не знаю, что именно вы хотите делать с пользователем, но выможно просто вернуть пользователей в метод хаба и сделать что-нибудь с connectionId.

YourHubClass.cs

public Task GetAllUsers()
{
    // Get the ConnectionId
    var connectionId = Context.ConnectionId;

    // Get the users list
    var users = userRepository.GetAllUsers(); 

    // ...

    return Clients.User(user).SendAsync("UserListRequested", users);
}
...