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()不会被击中。
这是你的问题:
您正在尝试使用专门为 ASP.NET Core 设计的模式,但您没有使用 ASP.NET Core,因此您没有获得该Startup模式或其任何功能,例如IApplicationBuilder或IWebHostEnvironment。
不久前,有人问我们是否可以弄清楚如何将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 甚至向您展示了如何操作(特别注意“部署类型”部分)。
鉴于您正在尝试配置 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。我们刚刚为其添加了后台服务:)