using System.Net; using System.Net.Http; using System.Net.Sockets; using QuickIP.Client.Models; namespace QuickIP.Client.Services; public sealed class AgentApiService { public async Task CheckHealthAsync(string baseAddress, string password, string localIPv4, CancellationToken cancellationToken = default) { try { using var handler = new SocketsHttpHandler(); if (!string.IsNullOrWhiteSpace(localIPv4)) { handler.ConnectCallback = async (context, token) => { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(new IPEndPoint(IPAddress.Parse(localIPv4), 0)); await socket.ConnectAsync(context.DnsEndPoint, token); return new NetworkStream(socket, ownsSocket: true); }; } using var client = new HttpClient(handler) { BaseAddress = new Uri(baseAddress), Timeout = TimeSpan.FromSeconds(5) }; client.DefaultRequestHeaders.Add("X-Admin-Password", password); using var response = await client.GetAsync("/api/health", cancellationToken); return new HealthCheckResult { Success = response.IsSuccessStatusCode, StatusCode = (int)response.StatusCode, Message = response.IsSuccessStatusCode ? "HTTP 健康检查通过。" : $"HTTP 健康检查返回状态码 {(int)response.StatusCode}。", }; } catch (Exception ex) { return new HealthCheckResult { Success = false, StatusCode = null, Message = ex.Message, }; } } }