【发布时间】:2020-05-12 22:15:17
【问题描述】:
我正在将 ASP.NET Core 应用程序 迁移到 Worker Service 模板,并打算保留 Startup 代码。
然而在
在 Program 中,我按照 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>();
});
调试时,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:无法解析服务类型 'Microsoft.AspNetCore.Builder.IApplicationBuilder' 尝试 激活“Kledex.Extensions.KledexAppBuilder”。
堆栈跟踪:
在 Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable'1 serviceDescriptors、ServiceProviderOptions 选项)在 Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection 服务,ServiceProviderOptions 选项)在 Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider(IServiceCollection 容器生成器)在 Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter'1.CreateServiceProvider(对象 容器生成器)在 Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider() 在 Microsoft.Extensions.Hosting.HostBuilder.Build()
当它到达CreateHostBuilder(args).Build().Run(); 并尝试解析注册的服务时,错误就会发生,而上面的错误依赖于Startup.Configure() 方法中的某些配置app.UseSomething();。
Startup.Configure() 中的断点未命中。
【问题讨论】:
-
崩溃时显示错误信息。通常 Startup 中的代码在第一个请求到来之前不会执行
-
我添加了错误详细信息等。 Startup 在应用程序运行后立即执行,这当然是有道理的,因为 Startup 中的服务注册发生在 before 服务和请求依赖项。您可能要解决的是服务和依赖项的解析,一旦请求它们就会发生。在示例控制器和 DI 中。然而,这里的问题是
Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env)永远不会被调用,即使在请求时也是如此。 -
我的意思是在普通的网络应用程序中,Startup.Configure 直到第一个请求才被调用。无论如何,您的错误消息表明它在该点之前都失败了,因为它无法创建似乎依赖于 IApplicationBuilder 的 KledexAppBuilder 实例,我非常肯定后者不会直接添加到 DI 容器中(因此他们的方法UseKledex ...我认为)
-
就是这样,但是像
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().UseIISIntegration()这样的效果很好。因此,Builder 的生命周期或需要配置的方式必须有所不同。 -
我认为这可能取决于您尝试使用 KledexAppBuilder 的位置。是在worker服务中吗?
标签: c# asp.net-core .net-core-service-worker