首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 網站可用性檢測:HttpWebRequest/HttpClient 完整實作與最佳實務

     編輯:關於C#

現代首選:HttpClient (單例/池化)


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");

舊版:HttpWebRequest (相容 .NET Framework)


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;
    }
}

關鍵差異與選擇

特性HttpClientHttpWebRequest
非同步支援原生 async/awaitBegin/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:避免 `SocketExhaustion`,DI 註冊 `AddHttpClient`。
  • HEAD 請求:僅驗證可用性時用 `HEAD`,節省頻寬;需驗證內容完整性用 `GET`。
  • 重試策略:Polly `WaitAndRetryAsync` (指數退避 + 抖動)。
  • 熔斷器:Polly `CircuitBreakerAsync` 避免雪崩效應。
  • 多節點檢測:從不同地域/ISP 發起檢測,排除單點誤判。
  • 憑證驗證:生產環境**勿**關閉 `ServerCertificateCustomValidation`,測試環境可用 `DangerousAcceptAnyServerCertificateValidator`。

總結

網站可用性檢測核心:**`HttpClient` 單例 + `HEAD` 請求 + `IsSuccessStatusCode` 判斷 + 例外捕獲 = 布林結果**。進階加入延遲測量、重試、熔斷、多點檢測,構建生產級健康檢查系統。舊專案維護用 `HttpWebRequest`,新專案**全面採用 `HttpClient`**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved