在Configure()之后启动IHostedService

2024-02-18

我有一个 .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(使用前将#替换为@)

在Configure()之后启动IHostedService 的相关文章

随机推荐