using System.Net.Sockets; namespace Dlhis.Middle.Services.Implements; public class HealthCheckService : IHealthCheckService { private bool _isOffline; private readonly string _hostName; private readonly ILogger _logger; private int _successRetry; private int _retry; public HealthCheckService(ILogger logger, IConfiguration configuration) { _logger = logger; _hostName = configuration.GetSection("HostName").Value; } public bool GetIsOffline() { return _isOffline; } public async Task DoHealthCheckAsync() { var cancellationTokenSource = new CancellationTokenSource(3000); var tcpClient = new TcpClient(); try { _logger.LogDebug("tcp connecting {host} {port}", _hostName, 443); await tcpClient.ConnectAsync(_hostName, 443, cancellationTokenSource.Token); _retry++; _logger.LogDebug("retry {retry}", _retry); if (tcpClient.Connected) { _successRetry++; _logger.LogDebug("success connected {count}", _successRetry); if (_successRetry == 4) { _isOffline = false; _successRetry = 0; _retry = 0; _logger.LogInformation("current is {status}", "healthy"); } else { _logger.LogDebug("wait next check in {waitTime}", _successRetry * 1000); await Task.Delay(_successRetry * 1000, cancellationTokenSource.Token); } } else { _successRetry = 0; _isOffline = true; _logger.LogDebug("current is {status}", "unavailable"); await Task.Delay(500); } } catch (Exception ex) { _logger.LogError("fail cause :{reason}", ex.Message); _isOffline = true; } } }