using MP.IOC.Data; using MP.IOC.Services; using NLog; using NLog.Web; using StackExchange.Redis; using System.Net; var builder = WebApplication.CreateBuilder(args); var logger = LogManager.Setup() .LoadConfigurationFromAppSettings() .GetCurrentClassLogger(); logger.Info("Program.cs: startup"); // Config setup ConfigurationManager configuration = builder.Configuration; // REDIS setup logger.Info("Config OK"); string connStringRedis = configuration.GetConnectionString("Redis"); string redisSrvAddr = connStringRedis.Substring(0, connStringRedis.IndexOf(":")); logger.Info("Setup REDIS OK"); // YARP base config builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); builder.Services.AddHttpForwarder(); // HttpMessageInvoker (SocketsHttpHandler) builder.Services.AddSingleton(sp => { var handler = new SocketsHttpHandler { AllowAutoRedirect = false, UseCookies = false, PooledConnectionLifetime = TimeSpan.FromMinutes(5), AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; // Accetta certificati non validi (dev only) handler.SslOptions = new System.Net.Security.SslClientAuthenticationOptions { RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true }; return new HttpMessageInvoker(handler); }); logger.Info("YARP reverse proxy configured"); // base services builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddHostedService(); // generic controller builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // avvio oggetto shared x redis... var redisMux = ConnectionMultiplexer.Connect(connStringRedis); builder.Services.AddSingleton(redisMux); builder.Services.AddSingleton(); logger.Info("Standard service configured"); // WeightProvider: Redis/Memory da config var weightOnRedis = builder.Configuration.GetValue("ServerConf:RedisWeight", false); if (weightOnRedis) { builder.Services.AddSingleton(redisMux); builder.Services.AddSingleton(); } else { builder.Services.AddSingleton(); } logger.Info($"Weight service configured | use Redis: {weightOnRedis}"); // RouteManager registration (singleton) builder.Services.AddSingleton(); logger.Info("Singleton Route Manager registered"); var app = builder.Build(); // aggiunt base URL x routing corretto string baseUrl = configuration.GetValue("ServerConf:BaseUrl") ?? ""; app.UsePathBase(baseUrl); logger.Info($"BaseUrl: {baseUrl}"); // Map route to RouteManager app.Map("/MP/IOC/api/RIOB/{**catchAll}", async (HttpContext ctx) => { var routeManager = ctx.RequestServices.GetRequiredService(); await routeManager.HandleAsync(ctx); }); logger.Info("App: route Mapped"); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment() || app.Environment.IsStaging()) { app.UseSwagger(); app.UseSwaggerUI(); } logger.Info("Added swagger"); app.UseHttpsRedirection(); app.UseAuthorization(); // aggiunta x index.html app.UseDefaultFiles(); app.UseStaticFiles(); app.MapControllers(); logger.Info("Run App"); app.Run();