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

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

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

1、 簡(jiǎn)述

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

  • ? 自動(dòng)重試
  • ? 超時(shí)控制
  • ? 熔斷保護(hù)
  • ? 彈性恢復(fù)

2、Polly 是什么?

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

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

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

3、實(shí)踐樣例

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

1?? 創(chuàng)建一個(gè)項(xià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 注冊(cè)命名的 HttpClient,然后通過(guò) AddPolicyHandler() 附加 Polly 策略,例如:

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

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

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

定義策略方法

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

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

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

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

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

注冊(cè) 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();

        // 注冊(cè) 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)用測(cè)試接口
        await TestHttpRequestAsync(client);
    }

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

3.4 運(yùn)行結(jié)果示例

運(yùn)行后輸出如下(每次重試等待更長(zhǎng)時(shí)間):

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

說(shuō)明:

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

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

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

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

注冊(cè)方式:

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

5、結(jié)語(yǔ)

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

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

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

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

相關(guān)文章

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

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

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

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

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

    C#中如何生成安裝包

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

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

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

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

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

    C#讀寫文件的方法匯總

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

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

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

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

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

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

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

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

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

最新評(píng)論

分宜县| 西和县| 从化市| 沂水县| 牟定县| 台安县| 高淳县| 盖州市| 法库县| 阿拉善盟| 湟中县| 新乡县| 大竹县| 教育| 深水埗区| 军事| 香格里拉县| 阜宁县| 奇台县| 长顺县| 武义县| 康保县| 东莞市| 乐亭县| 城固县| 四会市| 九龙城区| 勃利县| 达孜县| 鄂伦春自治旗| 阜南县| 定边县| 无锡市| 南安市| 北海市| 吉隆县| 澎湖县| 西盟| 综艺| 罗甸县| 阿鲁科尔沁旗|