Я использую 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?