#c# #asp.net-core #asp.net-core-signalr
#c# #asp.net-core #asp.net-core-signalr
Вопрос:
Я новичок в использовании SignalR и испытываю проблемы при попытке внедрить IHubContext в класс. Я получаю исключение, как показано ниже, когда пытаюсь запустить код. Он выдает ошибку в строке, где я пытаюсь внедрить TimerEventHandler в startup.cs Вот код:
public class TimerEventHandler : ITimerEventHandler
{
private readonly IConfiguration _config;
private readonly IHubContext<IndexHub> _hubContext;
public TimerEventHandler(IHubContext<IndexHub> hubContext,
IConfiguration config)
{
_hubContext = hubContext;
_config = config;
}
}
ITimerEventHandler
public interface ITimerEventHandler
{
Task OnTimedEvent(object source, ElapsedEventArgs e, string connectionId);
}
И вот код из моего Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(o =>
{
o.EnableDetailedErrors = true;
});
services.AddScoped<ITimerEventHandler, TimerEventHandler>();
}
Код из indexhub
public class IndexHub : Hub
{
private readonly IServiceBusHelper _serviceBusHelper;
private readonly ITimerEventHandler _timerEventHandler;
public IndexHub(IServiceBusHelper serviceBusHelper,
ITimerEventHandler timerEventHandler)
{
_serviceBusHelper = serviceBusHelper;
_timerEventHandler = timerEventHandler;
}
....
}
Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
Исключение, которое я получаю, это:
> System.AggregateException
HResult=0x80131500
Message=Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: my.portal.Hubs.ITimerEventHandler Lifetime: Scoped ImplementationType: my.portal.Hubs.TimerEventHandler': Unable to resolve service for type 'Microsoft.AspNet.SignalR.IHubContext`1[my.portal.Hubs.IndexHub]' while attempting to activate 'my.portal.Hubs.TimerEventHandler'.)
Source=Microsoft.Extensions.DependencyInjection
StackTrace:
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable`1 serviceDescriptors, ServiceProviderOptions options)
at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options)
at Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider(IServiceCollection containerBuilder)
at Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter`1.CreateServiceProvider(Object containerBuilder)
at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at my.portal.Program.Main(String[] args) in Program.cs:line 10
Может ли кто-нибудь из вас, экспертов, помочь?
Комментарии:
1. Используя предоставленный вами код, я не смог воспроизвести вашу проблему, она хорошо работает в моем проекте. Не могли бы вы поделиться своим
ITimerEventHandler
иIndexHub
. Также из вашего сообщения об ошибке, не могли бы вы поделиться своим Program.cs?2. @Rena Спасибо, что посмотрели. Я добавил код в соответствии с запросом.
3. Извините, то, что вы предоставляете, не то, что я хочу. Мне нужен
ITimerEventHandler
иIndexHub
. Не IndexHub.js .4. Извините, @Rena. Теперь я добавил ITimerHandler и IndexHub.
5. Также может хорошо работать в моем проекте. Возможно, некоторые другие вещи влияют на проект. Не могли бы вы, пожалуйста, создать новые репозитории, которые могли бы воспроизвести проблему? И я немного смущен тем, почему вы циклически ссылались на ITimerEventHandler и IndexHub?
Ответ №1:
Итак, я понял это! Я установил Microsoft.AspNet.SignalR.Основной пакет вместо Microsoft.AspNetCore.SignalR.Основной пакет. Спасибо @Rena за то, что посмотрели на это. Только то, что вы заставили меня более внимательно изучить мой код и попытаться разобрать его до основ, помогло мне решить эту проблему.