Отвечайте на веб-запросы во время прогрева приложений в Azure

#c# #.net #azure

Вопрос:

У меня есть веб-приложение на базе .NET 5, размещенное в Azure. У моего приложения довольно длительная фаза разогрева. Я хочу, чтобы мое приложение начинало отвечать на запросы только после выполнения всей логики, лежащей в основе прогрева. С другой стороны, я хочу отвечать на http-запросы еще до прогрева, чтобы сообщить пользователю, что он прогревается. Строка кода на тысячу слов. Это я хочу обслуживать, когда мое приложение прогревается:

 public sealed class PreStartup
{
    private static readonly DateTimeOffset Started = DateTimeOffset.UtcNow;
    
    public void ConfigureServices(IServiceCollection services)
    {
    }

    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (httpContext, _) => await httpContext.Response.WriteAsync($"Application has been warming up for {(DateTimeOffset.UtcNow - Started):g} now"));
    }
}
 

И точка входа в мое приложение выглядит примерно так:

 public static async Task Main()
{
    IConfiguration configuration = BuildConfiguration();
    
    IWebHost preHost = CreatePreWebHost(); // this guy responds to web requests before the app is warmed-up
    using IWebHost host = CreateWebHost(configuration); // this guy is my primary web host
    
    try
    {
        _ = preHost.StartAsync(); // start the pre host in a non-blocking manner
        await WarmupAsync(); // and proceed with the warmup (this takes long)
    }
    finally
    {
        await preHost.StopAsync(); // warmup is finished and the pre host is no longer needed - stop and dispose
        preHost.Dispose();
    }

    await host.RunAsync(); // the primary host takes over
}
 

Решение отлично работает при локальном запуске на моей машине. Проблемы начинаются при развертывании в Azure. Служба приложений перезапускает приложение, как только предварительный хост удален, и основной хост никогда не берет на себя управление.
Есть ли способ поменять местами веб-узел при запуске приложения?

Комментарии:

1. Вы знакомы с MapWhen ? Я полагаю, вы могли бы установить значение где-нибудь, когда прогреетесь, и использовать его с картой, когда ее запускать, или нет.

2. Я бы предпочел избегать смешивания трубопроводов перед прогревом и после прогрева, потому что это создаст много дополнительных сложностей. Таким образом, два веб-хостинга и разные Startup классы для каждого из них.

3. Вы думаете, что два хоста запуска менее сложны, чем флаг, который управляет картой, когда? Вы уже испытали трудности, связанные с этим.

4. Я имею в виду, что чище не смешивать логику до и после разминки. Локально мое решение работает как шарм. Мне просто интересно, можно ли поменять экземпляр веб-узла при работе в Azure. Переход UseMiddleware (для перенаправления на поток прогрева) BackgroundService (для выполнения прогрева) также в порядке, но добавляет зависимости и условия.