工作者服务中的ASP.NET Core没有调用配置IApplicationBuilder。

问题描述 投票:0回答:1

我正在迁移一个 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() 并没有被击中。

c# asp.net-core .net-core-service-worker
1个回答
0
投票

你可以将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>();
            });
© www.soinside.com 2019 - 2024. All rights reserved.