using DAL; using HRD.AppLogger; using HRD.WebApi; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using NLog.Web; using StaffDBServer.Extends; using StaffDBServer.SharedExtensions; using System; using System.Reflection; using HRD.LDAPService.JWT; using HRD.WebApi.DAL.Middleware; using HRD.WebApi.Helpers; using StaffDBServer.SharedControllers; using HRD.LDAPService; using Microsoft.AspNetCore.Server.IISIntegration; AppDomain.CurrentDomain.UnhandledException += (object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs) => { ILoggerManager logger = new LoggerManager(); logger.LogException((Exception)unhandledExceptionEventArgs.ExceptionObject, "Application closed due to exception."); NLog.LogManager.Flush(); }; ILoggerManager logger = new LoggerManager(); logger.LogWarn($"[Start WebApi Server] BaseDirectory: {AppDomain.CurrentDomain.BaseDirectory}; TargetFrameworkName: {AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName}"); try { var builder = WebApplication.CreateBuilder(args); var configuration = builder.Configuration; WebApiConfig.Init(configuration, Assembly.GetExecutingAssembly().GetName()); // Configure logging builder.Logging.ClearProviders(); builder.Logging.SetMinimumLevel(LogLevel.Warning); builder.Host.UseNLog(); // Add services to the container // at first //services.AddCors(); builder.Services.AddCustomCors("AllowAllOrigins"); builder.Services.Configure(options => { options.AuthenticationDisplayName = "Windows"; options.ForwardClientCertificate = true; options.AutomaticAuthentication = true; }); builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme); builder.Services.ConfigureJWT(StaffDBServer.Extends.JwtMiddlewareOptionsHelper.GetJwtMiddlewareOptions()); ; builder.Services.ConfigureDAL(WebApiMiddlewareOptionsHelper.GetWebApiMiddlewareOptions()); builder.Services.AddSingleton(); builder.Services.ConfigureSwagger(); builder.Services.ConfigureRepositoryWrapper(); // add repos var cnnStr = WebApiConfig.ConnectionString(EN_ConnectionType.SQLServer); builder.Services.AddDbContext(options => { const int dbTimeoutInMin = 5; options.UseSqlServer(cnnStr, opts => opts.CommandTimeout((int)TimeSpan.FromMinutes(dbTimeoutInMin).TotalSeconds)); }); builder.Services.AddStaffDBRepositories(); builder.Services.AddScoped(); builder.Services.AddJwtManagerWithLdap(configuration.GetSection("LdapOptions")); builder.Services.ConfigureWebApiExtensionsEnd(); // should come last var app = builder.Build(); ((IApplicationBuilder)app).ApplicationServices.SetupNLogServiceLocator(); // Configure the HTTP request pipeline if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } app.AddCustomExceptionHandling(); app.UseHttpsRedirection(); app.UseRouting(); app.UseCors("AllowAllOrigins"); app.UseDefaultFiles(); app.UseStaticFiles(); app.UseOpenApi(); app.UseDALMiddleware(); app.UseJwtMiddleware(); app.ConfigureSwagger(); app.MapControllers(); app.Run(); } catch (Exception ex) { logger.LogException(ex, "Stopped program because of exception"); throw; } finally { // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux) NLog.LogManager.Flush(); NLog.LogManager.Shutdown(); }