private static readonly HttpClient _http = new HttpClient
{
Timeout = TimeSpan.FromSeconds(10)
};
public static async Task IsSiteAliveAsync(string url)
{
try
{
using var resp = await _http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
return resp.IsSuccessStatusCode; // 2xx
}
catch (HttpRequestException)
{
return false; // DNS失敗、連線拒絕、逾時、SSL錯誤等
}
catch (TaskCanceledException) when (!Task.CurrentId.HasValue) // 僅捕獲逾時
{
return false;
}
}
// 使用
bool ok = await IsSiteAliveAsync("https://example.com");
public static bool CheckSite(string url)
{
try
{
var req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "HEAD"; // 僅取標頭,不下載內文
req.Timeout = 10000;
req.AllowAutoRedirect = true;
using (var resp = (HttpWebResponse)req.GetResponse())
{
return resp.StatusCode == HttpStatusCode.OK; // 200
}
}
catch (WebException)
{
return false;
}
}
| 特性 | HttpClient | HttpWebRequest |
|---|---|---|
| 非同步支援 | 原生 async/await | Begin/End 模式 (舊) |
| 連線池 | 自動池化 (單例) | 手動管理 |
| DNS 變更處理 | 需 `PooledConnectionLifetime` 設定 | 每次解析 |
| HTTP/2、gRPC | 支援 | 不支援 |
| 相容性 | .NET Core / 5+ / Framework 4.5+ | 所有 Framework |
public class HealthCheckResult
{
public bool IsHealthy { get; set; }
public int StatusCode { get; set; }
public TimeSpan Latency { get; set; }
public string Error { get; set; }
}
public static async Task CheckDetailedAsync(string url)
{
var sw = Stopwatch.StartNew();
try
{
using var req = new HttpRequestMessage(HttpMethod.Head, url);
using var resp = await _http.SendAsync(req, HttpCompletionOption.ResponseHeadersRead);
sw.Stop();
return new HealthCheckResult
{
IsHealthy = resp.IsSuccessStatusCode,
StatusCode = (int)resp.StatusCode,
Latency = sw.Elapsed
};
}
catch (Exception ex)
{
sw.Stop();
return new HealthCheckResult { IsHealthy = false, Latency = sw.Elapsed, Error = ex.Message };
}
}
網站可用性檢測核心:**`HttpClient` 單例 + `HEAD` 請求 + `IsSuccessStatusCode` 判斷 + 例外捕獲 = 布林結果**。進階加入延遲測量、重試、熔斷、多點檢測,構建生產級健康檢查系統。舊專案維護用 `HttpWebRequest`,新專案**全面採用 `HttpClient`**。