我使用 VS 2022 ASP.NET 6.0 创建了 Minimal API 模板,并添加了一个 BackgroundService 作为 HostedService。我将其部署到 Azure,它可以正常启动后台服务,我可以在日志中看到它。
但是,当我停止Azure中的Web应用程序时,不会调用BackgroundService的StopAsync。我需要将 Program.cs 中的某些内容与 builder.Host 连接起来吗?如果我需要执行其他正常关闭操作,我如何在代码中收到网络应用程序正在关闭的通知?
Program.cs
using MinAPI.Test.Workers;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddHostedService<Worker>();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.UseHttpsRedirection();
var summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
app.MapGet("/weatherforecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
DateTime.Now.AddDays(index),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
})
.WithName("GetWeatherForecast");
app.Run();
internal record WeatherForecast(DateTime Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
Worker.cs
namespace MinAPI.Test.Workers
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
_logger.LogInformation("Worker cancellation token finished ");
}
public override Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogWarning("Worker STARTING");
return base.StartAsync(cancellationToken);
}
public override Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogWarning("Worker STOPPING: {time}", DateTimeOffset.Now);
return base.StopAsync(cancellationToken);
}
}
}
最佳答案
我也遇到过类似的问题:
- 添加了托管服务:
services.AddHostedService<XXXWorker>();
在配置中 - 配置 Controller 的所有其他常见内容。
- IIS 站点配置为预加载并自动启动。
发现托管服务会在 AppPool 启动后立即自动启动,但在停止时从未收到任何关闭调用。
我发现,这种情况仅发生在 Controller 从未收到任何网络请求的情况下。如果至少制作了一个,那么一切都会如您所期望的那样工作。
不知道这是否有帮助。
关于c# - 使用 ASP.NET Core 6 Minimal API 停止 Azure 中的 Web 应用程序时,不会调用 BackgroundService StopAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70389548/