Свойство Context в SignalR Hub не дает мне Http Context с помощью метода GetHttpContext - PullRequest
0 голосов
/ 09 июля 2019

В моем приложении я планирую использовать SignalR для того, чтобы внутренний код отправлял сообщения вошедшему в систему пользователю в зависимости от условий, возникающих на сервере. В частности, я хочу, чтобы SignalR вызывал методы на клиенте JS всякий раз, когда что-то происходит на сервере. Это могут быть периодические вычисления, происходящие на бэкэнде, которые внезапно превышают пороговое значение, и мне нужно вызвать что-то на клиенте JS для конкретного пользователя. Конкретный пользователь является ключевым элементом здесь. Только Пользователь, который должен знать об этом. Я предполагаю, что это должно быть очень просто с SignalR, но у меня есть некоторые проблемы с пониманием того, как реализовать это. Мое решение следующее:

  • Каждый раз, когда пользователь входит в систему, я создаю группу SignalR и добавляю этого пользователя в эту группу.
  • Каждый раз, когда пользователь выходит из системы, я удаляю его из группы. (Я не знаю, могу ли я также удалить саму группу)
  • Теперь каждый раз, когда что-то происходит на сервере, я использую SignalR для передачи информации конкретному Пользователю, который должен знать об этом событии, путем вызова метода клиента JS и отправки в группу с именем, равным Идентификатору имени пользователь интереса.

Итак, чтобы применить это решение, мне нужно получить информацию о пользователе, который только что вошел в C # Hub, чтобы создать группу и присоединиться к нему.

Теперь моя проблема в том, как получить доступ к необходимой мне информации от пользователя, который входит в приложение в C # Hub. Меня интересует идентификатор имени пользователя, конечно. Я думал, что свойство Context в хабе должно дать мне необходимую информацию (это мое понимание документов MS), но я не могу заставить ее работать. Пожалуйста, изучите ниже код.

// As soon as a User logs in, below method fires. I try to get the information 
// in here but no success        

public override async Task OnConnectedAsync()
{
      var CID = Context.ConnectionId;   // this gives a unique connection ID
      var user = Context.User; // This returns nothing
      var userID = Context.UserIdentifier; // This returns nothing
      var httpContextObject = Context.GetHttpContext(); // This returns nothing
      await base.OnConnectedAsync();
}

Когда я вызываю другие методы в C # Hub из JS, метод запускается и информация передается, но я до сих пор не имею доступа к информации Свойство Context должно предоставить.

Пожалуйста, помогите мне сначала, подтвердив или исправив мой общий подход, и если есть хорошо известные лучшие практики. Во-вторых, пожалуйста, дайте мне знать, как я могу получить информацию, которую Свойство контекста предоставляет в Концентраторе, и вообще, где эта информация доступна, и как получить к ней доступ и использовать.

Большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 26 июля 2019

Я решил свою проблему, используя аутентификацию с SignalR. Мне не нужно добавлять пользователя в какие-либо группы, чтобы отправлять им массажи. В классе Startup я добавляю аутентификацию выше службы SignalR, а затем объект пользователя передается в концентратор в свойстве Context. Я также могу подтолкнуть любого пользователя, внедрив IHubContext в любой конструктор класса, который мне нужен.

0 голосов
/ 09 июля 2019

«Пользователь» - это принцип утверждений (обычно хранится в файле cookie asp), для получения пользователем формы вашей базы данных идентификации используйте:

var user = await _userManager.GetUserAsync(User);

Для дальнейшего использования ваш вопрос очень длинный, вы получите дополнительную помощь, если зададите краткие и точные вопросы.

...