public async Task Invoke(HttpContext httpContext, AppDataConnection dataConnection, IHostApplicationLifetime appLifetime, ILogger <FirstRunMiddleware> logger) { var initFlag = AppDomain.CurrentDomain.GetData(Token); if (initFlag is not null) { if ((bool)initFlag) { await _next(httpContext); return; } } if (!dataConnection.TestDatabaseConnection(exception => { logger?.LogCritical(exception, $"Error {nameof(dataConnection.TestDatabaseConnection)}, connection string: {dataConnection.ConnectionString}"); })) { httpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; await httpContext.Response.WriteAsync("Database connection failed. Please see error log, fix it and RESTART this application."); appLifetime?.StopApplication(); } else { if (dataConnection.IsFirstRun()) { try { dataConnection.SetupDatabase(); } catch (Exception e) { logger.LogCritical(e, e.Message); httpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; await httpContext.Response.WriteAsync("Error initializing first run, please check error log."); appLifetime?.StopApplication(); } } AppDomain.CurrentDomain.SetData(Token, true); await _next(httpContext); } }