最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#通過HttpClient+Polly實現(xiàn)自動重試與超時策略的操作指南

 更新時間:2025年11月10日 09:00:23   作者:拾荒的小海螺  
在微服務(wù)與API高度依賴的時代,網(wǎng)絡(luò)請求的 可靠性 變得至關(guān)重要,網(wǎng)絡(luò)波動、臨時超時或第三方API不穩(wěn)定,常常會導(dǎo)致應(yīng)用拋出異常,為了解決這些問題,本文給大家介紹了在C#中如何通過HttpClient + Polly實現(xiàn)自動重試與超時策略,需要的朋友可以參考下

1、 簡述

在微服務(wù)與 API 高度依賴的時代,網(wǎng)絡(luò)請求的 可靠性 變得至關(guān)重要。網(wǎng)絡(luò)波動、臨時超時或第三方 API 不穩(wěn)定,常常會導(dǎo)致應(yīng)用拋出異常。為了解決這些問題,C# 中可以通過 HttpClient + Polly 實現(xiàn):

  • ? 自動重試
  • ? 超時控制
  • ? 熔斷保護
  • ? 彈性恢復(fù)

2、Polly 是什么?

Polly 是 .NET 中一個功能強大的彈性與瞬態(tài)故障處理庫。
它允許開發(fā)者為代碼執(zhí)行定義策略,如:

  • Retry(重試)
  • Timeout(超時)
  • Circuit Breaker(熔斷)
  • Fallback(降級)
  • Bulkhead Isolation(隔離艙)

在實際項目中,它與 HttpClientFactory 搭配使用,構(gòu)成了強大的 網(wǎng)絡(luò)容錯體系。

3、實踐樣例

3.1 環(huán)境準(zhǔn)備

1?? 創(chuàng)建一個項目

dotnet new console -n HttpClientPollyDemo
cd HttpClientPollyDemo

2?? 安裝 NuGet 包

dotnet add package Microsoft.Extensions.Http
dotnet add package Polly
dotnet add package Polly.Extensions.Http

3.2 基礎(chǔ)原理

使用 IHttpClientFactory 注冊命名的 HttpClient,然后通過 AddPolicyHandler() 附加 Polly 策略,例如:

services.AddHttpClient("DemoClient")
    .AddPolicyHandler(GetRetryPolicy())
    .AddPolicyHandler(GetTimeoutPolicy());

這樣創(chuàng)建的 HttpClient 會在每次請求時自動應(yīng)用定義的重試與超時邏輯。

3.3 實現(xiàn)重試與超時策略

定義策略方法

using Polly;
using Polly.Extensions.Http;
using System;
using System.Net.Http;

public static class PolicyHandlers
{
    // 自動重試策略(最多重試 3 次)
    public static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
    {
        return HttpPolicyExtensions
            .HandleTransientHttpError() // 處理 5xx、408、網(wǎng)絡(luò)錯誤
            .WaitAndRetryAsync(
                retryCount: 3,
                sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), // 2,4,8 秒退避
                onRetry: (outcome, timespan, retryAttempt, context) =>
                {
                    Console.WriteLine($"重試第 {retryAttempt} 次,等待 {timespan.TotalSeconds} 秒。");
                });
    }

    // 超時策略(每次請求最長 5 秒)
    public static IAsyncPolicy<HttpResponseMessage> GetTimeoutPolicy()
    {
        return Policy.TimeoutAsync<HttpResponseMessage>(5);
    }
}

上述策略實現(xiàn)了:

  • 自動 指數(shù)退避重試(2s → 4s → 8s)
  • 超時控制(單次請求超 5 秒自動中斷)

注冊 HttpClient 與策略

using Microsoft.Extensions.DependencyInjection;
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var services = new ServiceCollection();

        // 注冊 HttpClient + Polly 策略
        services.AddHttpClient("ResilientClient", client =>
        {
            client.BaseAddress = new Uri("https://httpstat.us/");
            client.DefaultRequestHeaders.Add("User-Agent", "HttpClientPollyDemo");
        })
        .AddPolicyHandler(PolicyHandlers.GetRetryPolicy())
        .AddPolicyHandler(PolicyHandlers.GetTimeoutPolicy());

        var provider = services.BuildServiceProvider();
        var factory = provider.GetRequiredService<IHttpClientFactory>();

        var client = factory.CreateClient("ResilientClient");

        // 調(diào)用測試接口
        await TestHttpRequestAsync(client);
    }

    static async Task TestHttpRequestAsync(HttpClient client)
    {
        try
        {
            // 模擬 500 錯誤接口(會觸發(fā)重試)
            var response = await client.GetAsync("500");
            Console.WriteLine($"最終狀態(tài)碼:{response.StatusCode}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"請求失?。簕ex.Message}");
        }
    }
}

3.4 運行結(jié)果示例

運行后輸出如下(每次重試等待更長時間):

重試第 1 次,等待 2 秒。
重試第 2 次,等待 4 秒。
重試第 3 次,等待 8 秒。
請求失?。喉憫?yīng)狀態(tài)碼不成功,狀態(tài)碼: 500

說明:

  • 每次請求失敗后 Polly 自動重試;
  • 達到最大次數(shù)后才拋出異常;
  • 如果請求超時,則會觸發(fā) TimeoutRejectedException

4、結(jié)合熔斷(Circuit Breaker)

在部分 API 連續(xù)失敗時,熔斷 可以臨時阻止新的請求,以保護系統(tǒng)資源。

public static IAsyncPolicy<HttpResponseMessage> GetCircuitBreakerPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .CircuitBreakerAsync(
            handledEventsAllowedBeforeBreaking: 2, // 連續(xù) 2 次錯誤觸發(fā)熔斷
            durationOfBreak: TimeSpan.FromSeconds(10), // 熔斷 10 秒
            onBreak: (outcome, timespan) => Console.WriteLine($"熔斷開啟 {timespan.TotalSeconds} 秒"),
            onReset: () => Console.WriteLine("熔斷恢復(fù)"),
            onHalfOpen: () => Console.WriteLine("熔斷半開,嘗試恢復(fù)..."));
}

注冊方式:

services.AddHttpClient("ResilientClient", client =>
{
    client.BaseAddress = new Uri("https://httpstat.us/");
})
.AddPolicyHandler(PolicyHandlers.GetRetryPolicy())
.AddPolicyHandler(PolicyHandlers.GetTimeoutPolicy())
.AddPolicyHandler(PolicyHandlers.GetCircuitBreakerPolicy());

5、結(jié)語

通過結(jié)合 HttpClient + Polly,我們可以讓應(yīng)用:

  • 在網(wǎng)絡(luò)波動時自動重試;
  • 遇到卡頓時及時超時;
  • 遇到頻繁失敗時主動熔斷;
  • 自動恢復(fù)服務(wù)健康狀態(tài)。
功能說明
HttpClientFactory管理連接生命周期,防止 Socket 耗盡
Polly Retry自動重試機制,防止瞬態(tài)錯誤
Polly Timeout避免請求掛起太久
Polly Circuit Breaker熔斷保護,防止雪崩故障
組合策略構(gòu)建高可用、可恢復(fù)的 API 調(diào)用體系

這是一種現(xiàn)代 .NET 微服務(wù)中最常見、也是最推薦的 彈性策略組合。

以上就是C#通過HttpClient+Polly實現(xiàn)自動重試與超時策略的操作指南的詳細(xì)內(nèi)容,更多關(guān)于C# HttpClient+Polly自動重試與超時策略的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用checked語句防止數(shù)據(jù)溢出的解決方法

    使用checked語句防止數(shù)據(jù)溢出的解決方法

    本篇文章是對用checked語句防止數(shù)據(jù)溢出的解決方法進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Python結(jié)合wxPython構(gòu)建安全高速的文件移動工具

    Python結(jié)合wxPython構(gòu)建安全高速的文件移動工具

    這篇文章主要介紹了一款基于Python和wxPython開發(fā)的桌面文件移動工具FolderMoverPro,旨在解決Windows系統(tǒng)文件復(fù)制中的常見痛點,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2026-03-03
  • C#中如何生成安裝包

    C#中如何生成安裝包

    這篇文章主要介紹了C#中如何生成安裝包問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 利用Distinct()內(nèi)置方法對List集合的去重問題詳解

    利用Distinct()內(nèi)置方法對List集合的去重問題詳解

    這篇文章主要給大家介紹了關(guān)于利用Distinct()內(nèi)置方法對List集合的去重問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 逐步講解快速排序算法及C#版的實現(xiàn)示例

    逐步講解快速排序算法及C#版的實現(xiàn)示例

    快速排序在時間復(fù)雜度同為O(N*logN)的幾種排序方法中效率較高,因而比較常用,接下來這里就來逐步講解快速排序算法及C#版的實現(xiàn)示例
    2016-06-06
  • C#讀寫文件的方法匯總

    C#讀寫文件的方法匯總

    C#讀寫文件的方法匯總,需要的朋友可以參考一下
    2013-03-03
  • Unity實現(xiàn)模型點擊事件的方法

    Unity實現(xiàn)模型點擊事件的方法

    這篇文章主要介紹了Unity實現(xiàn)模型點擊事件的方法,本文通過多種方法給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • C# 可空值類型的具體使用

    C# 可空值類型的具體使用

    在C#編程中,可空值類型是一個非常有用的特性,它允許我們將值類型表示為可空,這在處理一些可能沒有值的情況時非常方便,具有一定的參考價值,感興趣的可以了解一下
    2025-07-07
  • C#?Socket數(shù)據(jù)接收的三種實現(xiàn)方式

    C#?Socket數(shù)據(jù)接收的三種實現(xiàn)方式

    本文主要介紹了C#?Socket數(shù)據(jù)接收的三種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C#中將字符串轉(zhuǎn)換為整型的三種解決方法總結(jié)

    C#中將字符串轉(zhuǎn)換為整型的三種解決方法總結(jié)

    本篇文章是對C#中將字符串轉(zhuǎn)換為整型的三種解決方法進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06

最新評論

横峰县| 台北市| 曲靖市| 寿光市| 威信县| 搜索| 拉孜县| 子长县| 桐乡市| 怀柔区| 浦县| 吴桥县| 泗洪县| 博兴县| 仁怀市| 长顺县| 睢宁县| 洞头县| 丽水市| 山东省| 浠水县| 广元市| 鄂州市| 蒙城县| 满洲里市| 西充县| 六安市| 普陀区| 东莞市| 绍兴县| 永昌县| 泗水县| 龙南县| 泊头市| 韶山市| 罗田县| 宁夏| 章丘市| 黄陵县| 井冈山市| 南部县|