Worker Service 中的 ASP.NET Core 不会调用 Configure IApplicationBuilder

Rau*_*ian 6 c# asp.net-core .net-core-service-worker

我正在将ASP.NET Core 应用程序迁移到 Worker Service 模板,并打算保留Startup代码。然而之后

程序中,我按照 MS Docs 中的描述保留了CreateHostBuilder

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>();
            });
Run Code Online (Sandbox Code Playgroud)

在调试时,ConfigureServices正在调用

public void ConfigureServices(IServiceCollection services)
Run Code Online (Sandbox Code Playgroud)

Configure在启动内,未达到/调用

public void Configure(IApplicationBuilder app)
Run Code Online (Sandbox Code Playgroud)

在它崩溃之前调用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>();
            });
Run Code Online (Sandbox Code Playgroud)

有趣的部分是以下代码实际上调用了Startup.Configure(IApplicationBuilder app)

public static IHostBuilder CreateHostBuilder(string[] args)
    => Host.CreateDefaultBuilder(args)
        .UseWindowsService()
        .ConfigureWebHostDefaults(webBuilder => webBuilder.Configure(Startup.Configure));
Run Code Online (Sandbox Code Playgroud)

一旦我添加ConfigureServices它就会跳过IApplicationBuilder配置调用。

我是否遗漏了什么或实现这一目标的建议方法是什么?

编辑:

确切的错误是:

InvalidOperationException:尝试激活“Kledex.Extensions.KledexAppBuilder”时无法解析“Microsoft.AspNetCore.Builder.IApplicationBuilder”类型的服务。

堆栈跟踪:

在 Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable'1 serviceDescriptors, ServiceProviderOptions options) 在 Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options) 在 Microsoft.Extensions.DependencyFactoryInjection.CreateCollectionBuilderServiceProviderIcontainerServiceServiceProvider ) 在 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()不会被击中。

And*_*ndy 7

这是你的问题:

您正在尝试使用专门为 ASP.NET Core 设计的模式,但您没有使用 ASP.NET Core,因此您没有获得该Startup模式或其任何功能,例如IApplicationBuilderIWebHostEnvironment

不久前,有人问我们是否可以弄清楚如何将StartupASP.NET Core 的模式引入到使用通用主机生成器而不使用 ASP.NET Core 的东西中。我想出了一个答案

上面的答案没有给你Configure(IApplicationBuilder app, IWebHostEnvironment env)方法,也不应该。该方法专门针对 Web Host。不是工人。除非您要启动 Web 主机,否则您没有理由需要此方法。

如果是这种情况,那么您应该重新开始并创建一个全新的 ASP.NET Core 应用程序......而不是 Worker。这会将您的应用程序配置为使用Microsoft.NET.Sdk.WebSDK,而不是Microsoft.NET.Sdk.WorkerSDK,从而为您提供因采用 Worker 路线而失去的功能。

除非您放弃 Worker SDK 并迁移到 ASP.NET Core SDK,否则您将不会得到适合您的答案。也许有人会想出一些办法,但很可能是一个拼凑的东西。加班时的拼凑行为是需要维持的 PITA。

Microsoft.NET.Sdk.Web使用Windows 服务没有任何问题。Microsoft 甚至向您展示了如何操作(特别注意“部署类型”部分)。


N P*_*iro 5

鉴于您正在尝试配置 Web 主机默认值并使用ASP.NET Core诸如此类的功能IApplicationBuilder我相信您正计划在某种 Web 服务器上运行该服务。它是否正确?

如果是这样,除了其他好的建议之外,我还有另一个建议,那就是继续使用应用程序ASP.NET Core- 显然可以使用几乎按原样Startup使用ConfigureServices方法Configure)以及可能是您以前的大部分应用程序。

为此,在您的 中Worker csproj,您可以替换<Project Sdk="Microsoft.NET.Sdk.Worker"><Project Sdk="Microsoft.NET.Sdk.Web">.

然后,您可以配置您的,CreateHostBuilder例如:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(
            webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}
Run Code Online (Sandbox Code Playgroud)

请注意,我是故意删除的,因为我描述的是使用而不是具体的UseWindowsService()情况。Worker servicesWindows services

现在您可以继续使用您的Startup类,添加后台服务的注册:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        // ...
    }
    
    public void ConfigureServices(IServiceCollection services)
    {
        // ...
        services.AddHostedService<Worker>();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助:)但是,如果您特别想要开发Windows services而不是Worker services,请告诉我们。

在这种情况下,我们仍然拥有一个具有所有功能的 ASP.NET Core WebApp/WebAPI。我们刚刚为其添加了后台服务:)