我有一个 .NET Core 3.1 应用程序,它提供一个描述应用程序运行状况的端点,以及一个处理数据库中数据的 IHostedService。
但有一个问题,HostedService 的工作函数开始处理很长时间,结果Configure()
未调用 Startup 中的方法/status
端点未运行。
我想要/status
端点在 HostedService 启动之前开始运行。如何在托管服务之前启动端点?
示例代码
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<SomeHostedProcessDoingHeavyWork>();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/status", async context =>
{
await context.Response.WriteAsync("OK");
});
});
}
}
托管服务
public class SomeHostedProcessDoingHeavyWork : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
await MethodThatRunsForSeveralMinutes();
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
}
private async Task MethodThatRunsForSeveralMinutes()
{
// Process data from db....
return;
}
}
我尝试探索添加 HostedServiceConfigure()
, but app.ApplicationServices
是一个 ServiceProvider 因此是只读的。
我认为提出的解决方案是一种解决方法。
如果您添加托管服务inside 配置服务(),将会启动before红隼因为通用Web主机服务(实际上运行 Kestrel),当您调用时添加到 Program.cs 中
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseStartup<Startup>()
)
所以它总是最后添加。
启动您的托管服务afterKestrel,只需将另一个调用链接到
.ConfigureServices(s => s.AddYourServices())
致电后ConfigureWebHostDefaults()
.
像这样的事情:
IHostBuilder hostBuilder = Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>())
.ConfigureServices(s => {
s.AddHostedService<SomeHostedProcessDoingHeavyWork>();
});
你应该完成了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)