c# - 使用 ASP.NET Core 6 Minimal API 停止 Azure 中的 Web 应用程序时,不会调用 BackgroundService StopAsync

标签 c# azure asp.net-core azure-web-app-service

我使用 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);
        }
    }
}

enter image description here

最佳答案

我也遇到过类似的问题:

  • 添加了托管服务: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/

相关文章:

c# - .Net/C# 说明

javascript - 加载时修改模态窗口中的数据

c# - WebSocket 握手错误 : Unexpected response code 400

c# - 在 C# 中禁用单元测试的超时

c# - 面向方面编程?

c# - ContentControl 内容属性不随托管内容而改变

Azure 同步到数据库

azure - 升级无法接受取消 token 的 Service Fabric 服务

sql-server - 如何将 SQL Server 数据库发布到 Azure 以更新现有数据库

http - 在 Windows 10 上拦截来自 ASP.NET Core 1.0 的本地主机流量