Подтвердить что ты не робот

Получение текущего концентратора в 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 - что приятно иметь.

Надеюсь, есть лучший способ сделать это?

4b9b3361

Ответ 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 не участвовал при выполнении запроса на сервер и поэтому не может предоставить свойства.