Получение текущего концентратора в SignalR
Есть ли хороший способ вызова методов в концентраторе SignalR с контроллера?
Сейчас у меня есть это:
public class StatsHub : Hub
{
private static readonly Lazy<StatsHub> instance = new Lazy<StatsHub>(() => new StatsHub());
public static StatsHub Instance { get { return instance.Value; } }
public StatsHub()
{
if (this.Clients == null)
{
var hubContext = SignalR.GlobalHost.ConnectionManager.GetHubContext<StatsHub>();
this.Clients = hubContext.Clients;
this.Groups = hubContext.Groups;
}
}
// methods here...
}
поэтому в моих действиях контроллера я могу просто сказать, например
StatsHub.Instance.SendMessage("blah");
и это почти хорошо, за исключением того, что hubContext не имеет свойств Caller или Context Hub - что приятно иметь.
Надеюсь, есть лучший способ сделать это?
Ответы
Ответ 1
Найти DefaultHubManager, который мне нужен, я думаю.
DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver);
var hub = hd.ResolveHub("AdminHub") as AdminHub;
hub.SendMessage("woohoo");
Работает. Если есть еще лучший/предпочтительный способ - пожалуйста, поделитесь.
Ответ 2
Если вы хотите транслировать через концентратор извне концентратора, вам нужно GlobalHost.ConnectionManager.GetHubContext<MyHub>()
, чтобы получить контекст концентратора. Вы можете использовать этот контекст для трансляции с помощью свойства .Clients
.
Как указано в вашем примере кода, вы уже получаете контекст хаба, но это делается внутри центра, но, по-моему, это не кажется правильным. Если вы используете логику в SendMessage()
из своих действий контроллера, я бы переместил код прямо в действие контроллера и использовал контекст концентратора, полученный через GetHubContext<T>()
оттуда.
Обратите внимание, что свойство Caller
или Context
всегда будет null
в этом сценарии, потому что SignalR не участвовал при выполнении запроса на сервер и поэтому не может предоставить свойства.