using Microsoft.Extensions.Options; public sealed class CentralReachabilityService : BackgroundService { private readonly IHttpClientFactory _http; private readonly CentralApiOptions _central; private readonly GatewayOptions _gateway; private volatile bool _isReachable; public bool IsCentralReachable => _isReachable; public CentralReachabilityService( IHttpClientFactory http, IOptions central, IOptions gateway) { _http = http; _central = central.Value; _gateway = gateway.Value; } protected override async Task ExecuteAsync(CancellationToken ct) { using var timer = new PeriodicTimer( TimeSpan.FromSeconds(_gateway.CentralReachabilityIntervalSeconds)); while (await timer.WaitForNextTickAsync(ct)) await ProbeAsync(ct); } private async Task ProbeAsync(CancellationToken ct) { try { var client = _http.CreateClient("central"); client.BaseAddress = new Uri(_central.BaseUrl); var resp = await client.GetAsync("/health/ready", ct); _isReachable = resp.IsSuccessStatusCode; } catch { _isReachable = false; } } }