using System.Net.Http.Headers; using System.Text; using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Options; using EmailMicroservice.Models; namespace EmailMicroservice.Services { public class ExchangeHealthCheck : IHealthCheck { private readonly MailSettings _mailSettings; private readonly IHttpClientFactory _httpClientFactory; public ExchangeHealthCheck(IOptions options, IHttpClientFactory httpClientFactory) { _mailSettings = options.Value; _httpClientFactory = httpClientFactory; } public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) { try { var client = _httpClientFactory.CreateClient("ExchangeClient"); // Si Exchange se "traba" y no responde en 10 segundos, cortamos la llamada. // Esto evita que tu microservicio se quede congelado esperando. client.Timeout = TimeSpan.FromSeconds(10); // Usamos las mismas credenciales que el servicio principal para asegurar consistencia client.DefaultRequestHeaders.Authorization = GetBasicAuthHeader(); string? url = _mailSettings.EwsUrl; if (string.IsNullOrEmpty(url)) { return HealthCheckResult.Degraded("URL de Exchange no configurada."); } // Intentamos conectar. Si Exchange no responde, aquí saltará el error a los 10 seg. var response = await client.GetAsync(url, cancellationToken); if (response.IsSuccessStatusCode) { return HealthCheckResult.Healthy("Conexión a Exchange operativa."); } return HealthCheckResult.Unhealthy($"Exchange respondió error: {response.StatusCode}"); } // TIMEOUT catch (TaskCanceledException) { return HealthCheckResult.Unhealthy("Sin respuesta del servicio Exchange: posible caída o latencia excesiva (>10s)."); } catch (Exception ex) { return HealthCheckResult.Unhealthy("Fallo crítico de conexión.", ex); } } private AuthenticationHeaderValue GetBasicAuthHeader() { var emailAddress = string.IsNullOrEmpty(Environment.GetEnvironmentVariable("EMAIL_ADDRESS")) ? _mailSettings.EmailAddress : Environment.GetEnvironmentVariable("EMAIL_ADDRESS"); var pass = string.IsNullOrEmpty(Environment.GetEnvironmentVariable("EMAIL_PASS")) ? _mailSettings.Password : Environment.GetEnvironmentVariable("EMAIL_PASS"); var byteArray = Encoding.ASCII.GetBytes($"{emailAddress}:{pass}"); return new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); } } }