1. 程式人生 > 其它 >.NetCore5中HttpClient使用Polly重試的簡單實現

.NetCore5中HttpClient使用Polly重試的簡單實現

Polly是一個非常強大的元件,今天我們來使用HttpClient結合Polly做一個失敗重試的簡單示例。為啥有此示例,實在是網上的教程太亂了,嘗試了好多次才成功。應該是我看官方文件有點費勁,英文差,靠百度翻譯,一邊看註釋然後一邊翻譯!好累好累。

在實際開發中,.NetCore開發環境,我們使用HttpClient的方法,一般分3種方式:工廠模式,命名客戶端模式,型別客戶端模式。今天我們來使用命名客戶端模式結合Polly做重試。

步驟1:新增2個包:Polly和Microsoft.Extensions.Http.Polly

其實只要引入Microsoft.Extensions.Http.Polly 這一個包就可以了,他會自動將Polly引入。我之所以單獨再新增Polly,是看到Polly有最新版本,而Microsoft.Extensions.Http.Polly自動引入的Polly包不是最新版(強迫症啊)。

步驟2:配置服務

StartUp的ConfigureServices裡新增程式碼,先看程式碼再解說:

            services.AddHttpClient("myhttpclienttest", client =>
            { 
                client.BaseAddress = new Uri("http://localhost:9002/");
            }).AddTransientHttpErrorPolicy(builder =>
            {

                return builder.RetryAsync(20
, (res, Index) => { Console.WriteLine($"執行錯誤,異常行為:{res?.Result}"); Console.WriteLine($"第{Index}次重試"); }); }) ;

AddHttpClient("myhttpclienttest",xxxx) 這個模式就是命名客戶端模式,可以配置其地址或者請求頭配置等;

AddTransientHttpErrorPolicy這個方法就是在HttpClient客戶端新增Polly的失敗重試策略。builder配置重試次數,這裡是20次,只要1個引數即可;若想要列印日誌,也是可以的,看上面的程式碼。

注:1、一般的做法肯定是要加日誌的,為了便於排查問題和確保程式碼的正確性,不然誰也不知道自己寫的程式碼,是否真的管用啊。

2、失敗重試的條件預設是 對方(這裡的http://localhost:9002/)的Http狀態值返回500,5xxx(伺服器錯誤 Server Errors)和408 (請求超時 request timeout);當然也可以自定義,這裡先不做擴充套件。

3、為了演示方面,我將重試直接設定20次。

第3步:就可以實際操作httpclient的具體方法了

寫個簡單的demo程式碼吧:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

namespace HttpClientDemo.Controllers
{


    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
         
        private readonly ILogger<WeatherForecastController> _logger;

        private readonly IHttpClientFactory _clientFactory; 
        public WeatherForecastController(ILogger<WeatherForecastController> logger, IHttpClientFactory clientFactory)
        {
            _logger = logger;
            _clientFactory = clientFactory; 

        }

        /// <summary>
        /// 測試HttpClient和Polly
        /// </summary>
        /// <returns></returns>

        [HttpGet]
        public async Task<string> Get()
        {
            try
            {
                Console.WriteLine("請求處理開始。。。。"); 

                var client = _clientFactory.CreateClient("myhttpclienttest");
           
                var htmlStr = await client.GetStringAsync("nav/ops23");
                Console.WriteLine("請求處理結束。。。。");
                 
                return "";
            }
            catch (Exception ex)
            {

                throw;
            }
        } 
    }
}

為了對方的地址返回500,我將http://localhost:9002/站點下的appsettings.json 刪掉。就直接報503異常了。

執行後,看效果能看到日誌了。

作者:沐雪
文章均系作者原創或翻譯,如有錯誤不妥之處,歡迎各位批評指正。本文版權歸作者和部落格園共有,如需轉載懇請註明。
如果您覺得閱讀這篇部落格讓你有所收穫,請點選右下方【推薦】
找一找教程網-隨時隨地學軟體程式設計 http://www.zyiz.net/