Реализовываю Graceful shutdown на ASP.NET Core 2.1. Заметил, что при вызове SIGINT или Ctrl+C в консоли все запросы, которые обрабатываются в данный момент, прерываются. Соответственно, если Controller через свои Action выполняет какие-либо запросы в DB без транзакций, система может оказаться в неконсистентном состоянии.
Из описания IApplicationLifetime https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.iapplicationlifetime?view=aspnetcore-2.1
Рассмотрим событие ApplicationStopping
ApplicationStopping Triggered when the application host is performing a graceful shutdown. Requests may still be in flight. Shutdown will block until this event completes.
Я ожидал, что сервак дождется завершения обработки текущих запросов, запретив приходить новым. В реальности же он вырубается несмотря на существующие запросы.
Как дождаться завершения текущих запросов?
Пример:
public static void Main(string[] args) {
WebHostExtensions.Run(BuildWebHost(args));
}
private static IWebHost BuildWebHost(string[] args) {
return WebHostExtensions.CreateDefaultBuilder(args)
.UseSerilog()
.UseStartup<Startup>()
.UseUrls("http://0.0.0.0:9100")
.Build();
}
Контроллер:
public class UserOrdersController : Controller
{
public async Task<IActionResult> GetUserOrders(string productId)
{
await Task.Delay(5000);
Console.WriteLine("Finished");
//.....................................
}
}
"Finished" не будет выведено, если послать сигнал о завершении.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости