Создание IHubContext в ASP. NET Core - PullRequest
1 голос
/ 20 марта 2020

Я использую SignalR в разных местах моего веб-проекта. В моих контроллерах и HostedService это работает нормально. Клиенты создают экземпляры соединений с моим концентратором, и я могу общаться с ними обратно, используя экземпляр IHubContext, внедренный в конструктор каждого контроллера / hostedservice.

У меня есть еще один синглтон, работающий в фоновом режиме (без HosteService или BackgroundTask). Этот класс также получает IHubContext, вставленный в конструктор. Тем не менее, каждый раз, когда он вызывается, кажется, что этот синглтон имеет другой экземпляр IHubContext, так как к этому контексту не подключены клиенты / группы.

Этот класс регистрируется как этот в функции запуска:

services.AddSingleton<IServiceEventHandler<TourMonitorEvent>, TourMonitorEventHandler>();

Чтобы настроить SignalR, я выполняю в ConfigureServices следующее:

services.AddSignalR().AddNewtonsoftJsonProtocol();

и следующее в конфигурации:

app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<MyHubClass>("/hubEndpoint");
    endpoints.MapControllers();
});

IHubContext вводится как следующие в Controllers / Hostedservices и в синглтоне:

public class MySingleton : IHandler<SomeGenericClass>
{
    private readonly IHubContext<MyHubClass> _hubContext;

    public MySingleton(IHubContext<MyHubClass> hubContext)
    {
        _hubContext = hubContext;
    } 
}

Контроллеры / HosteService создаются не так, как мой Singleton, таким образом, что это может повлиять на создание экземпляра IHubContext?

1 Ответ

0 голосов
/ 20 марта 2020

Как сказано в документации :

Концентраторы являются временными.

Так как вы, Singleton, не являетесь HostedService или BackgroundTask, я рекомендовал бы ввести концентратор с помощью DI.

private IHubContext<MyHubClass, IMyHubClass> MyHubClass
{
    get
    {
        return this.serviceProvider.GetRequiredService<IHubContext<MyHubClass, IMyHubClass>>();
    }
}

Попробуйте и проверьте, соответствует ли контекст сейчас ожидаемому.

...