ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.NetCore5中HttpClient使用Polly重试的简单实现

2021-07-14 13:02:47  阅读:263  来源: 互联网

标签:Polly Http System 重试 using NetCore5 HttpClient


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异常了。

运行后,看效果能看到日志了。

 

标签:Polly,Http,System,重试,using,NetCore5,HttpClient
来源: https://www.cnblogs.com/puzi0315/p/15010268.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有