我正在迁移一个 ASP.NET核心应用 劳动者服务模板,并打算将其保持在原样。Startup
然而,在
内 程式 我保留了 创建HostBuilder 如MS Docs上所述。
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureWebHostDefaults(
webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices(
services =>
{
services.AddHostedService<Worker>();
});
调试时, ConfigureServices
被称为
public void ConfigureServices(IServiceCollection services)
而 Configure
内,未达到称为
public void Configure(IApplicationBuilder app)
在它崩溃之前,调用 Run()
.
我也试了一下,结果一样。
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureWebHostDefaults(webBuilder => webBuilder.Configure(Startup.Configure))
.ConfigureServices(
services =>
{
Startup.ConfigureServices(services);
services.AddHostedService<Worker>();
});
有趣的是,下面的代码实际上调用了 Startup.Configure(IApplicationBuilder app)
:
public static IHostBuilder CreateHostBuilder(string[] args)
=> Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureWebHostDefaults(webBuilder => webBuilder.Configure(Startup.Configure));
只要我一加 ConfigureServices
它跳过 IApplicationBuilder
配置调用。
是我遗漏了什么,还是建议用什么方法来实现?
编辑。
确切的错误是:
InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Builder.IApplicationBuilder' while attempting to activate 'Kledex.Extensions.KledexAppBuilder'.
堆栈跟踪。
在Microsoft.Extensions.DependencyInjection.ServiceProvider.ctor(IEnumerable'1 serviceDescriptors, ServiceProviderOptions options) 在Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options) 在Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options)。 DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider(IServiceCollection containerBuilder)在Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter'1.CreateServiceProvider(Object containerBuilder)在Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()在Microsoft.Extensions.Hosting.HostBuilder.Build()
的时候就会发生错误。CreateHostBuilder(args).Build().Run();
并试图解析注册的服务,而上面的服务则依赖于一些配置。app.UseSomething();
之内 Startup.Configure()
方法中的断点。
中的一个断点。Startup.Configure()
并没有被击中。
你可以将HostedService的配置从Program类移到Startup中。只需在调用AddControllers之前将其添加到ConfigureServices方法中即可。
services.AddHostedService<Worker>();
我在我的项目中用这种方式加入了HostedService,并且成功了。
这就是我的Standart CreateHostBuilder。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});