using Elecciones.Database; using Elecciones.Infrastructure.Services; using Elecciones.Worker; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using System.Net.Http; using System.Net.Security; using System.Security.Authentication; Log.Logger = new LoggerConfiguration() .WriteTo.Console() .CreateBootstrapLogger(); Log.Information("Iniciando Elecciones.Worker Host..."); var builder = Host.CreateApplicationBuilder(args); builder.Services.AddSerilog(config => config .ReadFrom.Configuration(builder.Configuration) .Enrich.FromLogContext() .WriteTo.Console() .WriteTo.File("logs/worker-.log", rollingInterval: RollingInterval.Day)); // --- Configuración de Servicios --- var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); builder.Services.AddDbContext(options => options.UseSqlServer(connectionString)); #if DEBUG builder.Services.AddSingleton(); #else builder.Services.AddHttpClient("ElectoralApiClient", client => { var baseUrl = builder.Configuration["ElectoralApi:BaseUrl"]; if (!string.IsNullOrEmpty(baseUrl)) { client.BaseAddress = new Uri(baseUrl); } // Limpiamos headers por defecto y añadimos uno que simula ser un navegador moderno. // Esto es crucial para pasar a través de WAFs (Web Application Firewalls). client.DefaultRequestHeaders.Clear(); client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"); }) .ConfigurePrimaryHttpMessageHandler(() => { return new SocketsHttpHandler { SslOptions = new SslClientAuthenticationOptions { // Forzamos el protocolo TLS 1.3 EnabledSslProtocols = SslProtocols.Tls13, // --- ¡¡¡LA LÍNEA CLAVE CORREGIDA!!! --- // Forzamos explícitamente los únicos 3 cipher suites que el servidor acepta. CipherSuitesPolicy = new CipherSuitesPolicy(new[] { TlsCipherSuite.TLS_AES_128_GCM_SHA256, TlsCipherSuite.TLS_AES_256_GCM_SHA384, TlsCipherSuite.TLS_CHACHA20_POLY1305_SHA256 }) } }; }); builder.Services.AddSingleton(); // --- FIN DE LA SECCIÓN MODIFICADA --- #endif builder.Services.AddHostedService(); var host = builder.Build(); try { host.Run(); } catch (Exception ex) { Log.Fatal(ex, "El Host de Elecciones.Worker terminó inesperadamente"); } finally { Log.CloseAndFlush(); }