AgentApiService.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System.Net;
  2. using System.Net.Http;
  3. using System.Net.Sockets;
  4. using QuickIP.Client.Models;
  5. namespace QuickIP.Client.Services;
  6. public sealed class AgentApiService
  7. {
  8. public async Task<HealthCheckResult> CheckHealthAsync(string baseAddress, string password, string localIPv4, CancellationToken cancellationToken = default)
  9. {
  10. try
  11. {
  12. using var handler = new SocketsHttpHandler();
  13. if (!string.IsNullOrWhiteSpace(localIPv4))
  14. {
  15. handler.ConnectCallback = async (context, token) =>
  16. {
  17. var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  18. socket.Bind(new IPEndPoint(IPAddress.Parse(localIPv4), 0));
  19. await socket.ConnectAsync(context.DnsEndPoint, token);
  20. return new NetworkStream(socket, ownsSocket: true);
  21. };
  22. }
  23. using var client = new HttpClient(handler) { BaseAddress = new Uri(baseAddress), Timeout = TimeSpan.FromSeconds(5) };
  24. client.DefaultRequestHeaders.Add("X-Admin-Password", password);
  25. using var response = await client.GetAsync("/api/health", cancellationToken);
  26. return new HealthCheckResult
  27. {
  28. Success = response.IsSuccessStatusCode,
  29. StatusCode = (int)response.StatusCode,
  30. Message = response.IsSuccessStatusCode
  31. ? "HTTP 健康检查通过。"
  32. : $"HTTP 健康检查返回状态码 {(int)response.StatusCode}。",
  33. };
  34. }
  35. catch (Exception ex)
  36. {
  37. return new HealthCheckResult
  38. {
  39. Success = false,
  40. StatusCode = null,
  41. Message = ex.Message,
  42. };
  43. }
  44. }
  45. }