.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/