#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
(для выполнения прогрева) также в порядке, но добавляет зависимости и условия.