У меня есть приложение, использующее SignalR & WebAPI. У меня есть настраиваемый контекст авторизации, основанный на токене, который я предоставляю каждому запросу SignalR с помощью QueryString.SignalR нацеливает определенного пользователя с сервера на пользовательский IUserIdProvider
Я реализую и IUserIdProvider
, чтобы извлечь моего пользователя из токена.
И, наконец, я хочу вызвать клиентский метод с сервера, для конкретного пользователя (с идентификатором), я использую HubContext из GlobalHost.ConnectionManager
.
Моя проблема заключается в том, что мой Пользователь никогда не найти из моего HubContext, но от самого концентратора ...
Вот моя реализация IUserIdProvider
public class SignalRUserIdProvider : IUserIdProvider
{
public string GetUserId(IRequest request)
{
var token = request.QueryString["token"];
var scope = GetUnprotectedScope(token);
if (scope == null)
return null;
return scope.Id_User.ToString();
}
}
Вот мой концентратор imlementation
[HubName("notifier")]
public class NotifierHub : Hub
{
public void Notify(string message)
{
Clients.User("1").Notify(message); //When call from a client, this works very well, only the User with the Id = 1 receive the notification
}
}
И, наконец, я использую это для вызова метода клиент с моего сервера:
GlobalHost
.ConnectionManager
.GetHubContext<NotifierHub>()
.Clients
.User("1")
.Notify(notification.Message);
// This does nothing...
У меня нет решения на данный момент, я не понимаю, что происходит, кто-то уже достиг этого?
Что происходит, когда вы отлаживаете метод GetUserId? Является ли 'Scope' нулевым? – Jonny
Все, что было бы хорошо в моем SignalRUserIdProvider, у меня всегда есть мой токен в QueryString и мой Id_User в области. Он находится в вызове GlobalHost.ConnectionManager, где Пользователь не найден и уведомление не отправлено. – jbuiss0n