一、介绍

  在IServiceCollection调用AddHttpClient注册IHttpClientFactory服务,调用AddHttpMessageHandler以生成出站请求中间件管道。 每个处理程序都可以在出站请求前后执行工作。通过Polly 的处理程序,以表达策略处理重试、断路器、超时、隔离和回退。

二、使用http请求

1.配置注册

var host = new HostBuilder()
.ConfigureServices((context, services) => {
services.AddHttpClient();
services.AddHostedService<MyHostedService>();
})
.UseConsoleLifetime()
.Build();

2.请求的后台服务

public Task StartAsync(CancellationToken cancellationToken)
{
return Task.Run(async () =>
{
var request = new HttpRequestMessage(HttpMethod.Post, "http://www.baidu.com");
request.Headers.Add("Accept", "application/json");//设置请求头
request.Properties.Add("id","");//设置请求参数
var client = _clientFactory.CreateClient();
var response = await client.SendAsync(request);
string result = null;
if (response.IsSuccessStatusCode)
{
result = await response.Content.ReadAsStringAsync();
}
});
}

3.执行时控制台输入日志

二、以客户端的方式使用

在客户端中配置,默认请求Url地址和默认的header。

public class HaosRequestService
{
public HttpClient Client { get; } public HaosRequestService(HttpClient client)
{
//配置默认值
client.BaseAddress = new Uri("http://www.baidu.com/");
client.DefaultRequestHeaders.Add("Accept","application/json");
Client = client;
}
/// <summary>
/// 封装常用方法
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public async Task<string> SeachAsync(string key)
{
var content = new FormUrlEncodedContent(new[] {
new KeyValuePair<string,string>("w","关键字"),
});
var response = await Client.PostAsync("/s",content);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}

在IServiceCollection中注册

var host = new HostBuilder()
.ConfigureServices((context, services) => {
services.AddHttpClient<HaosRequestService>();
services.AddHostedService<MyHostedService>();
})

三、处理出站 HTTP 请求

IHttpClientFactory 可以为客户端定义处理程,支持注册和链接多个处理程序。要创建处理程序,先定义一个继承 DelegatingHandler 的类。 重写 SendAsync 方法,在将请求传递至管道中的下一个处理程序之前

using System.Net.Http;
using System.Threading;
using System.Threading.Tasks; namespace Haos.Develop.HttpRequest.Samples
{
public class ColationDelegatingHandler:DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//此处实现过滤逻辑
return base.SendAsync(request, cancellationToken);
}
}
}
var Host = new HostBuilder()
.ConfigureAppConfiguration(builder =>
{
builder.AddCommandLine(args);
})
.ConfigureServices((context, services) =>
{
services.AddHttpClient<RequestClient>()
//注册过滤程序
.AddHttpMessageHandler<ColationDelegatingHandler>();
})
.UseConsoleLifetime()
.Build();

四、基于Polly的处理程序

  Polly 以表达策略,例如以流畅且线程安全的方式处理重试、断路器、超时、Bulkhead 隔离和回退。Microsoft.Extensions.Http.Polly NuGet 包中提供 Polly 扩展实现将 Polly 策略用于配置的 HttpClient 实例。

  Polly 添加策略分为三种

    1. AddTransientHttpErrorPolicy:是处理Http请求的错误,如HTTP 5XX 的状态码,HTTP 408 的状态码 以及System.Net.Http.HttpRequestException异常

    2. AddPolicyHandler:添加自定义策列

    3. AddPolicyHandlerFromRegistry:从Policy注册表集合里面选择添加

  a. AddTransientHttpErrorPolicy

.ConfigureServices((context, services) =>
{
services.AddHttpClient<RequestClient>()
.AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(, t => TimeSpan.FromMilliseconds()))
//或。上下都是定义了,错误重试上面是间隔都是500毫秒,下面则定义了每次重试的时间间隔
.AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[] {
TimeSpan.FromSeconds(),
TimeSpan.FromSeconds(),
TimeSpan.FromSeconds()
}));
})

  b. AddPolicyHandler

  先定义策略,在通过AddPolicyHandler方法添加,改方法接收一个泛型的IAsyncPolicy<HttpResponseMessage>。HttpResponseMessage我理解为出站请求上下文

.ConfigureServices((context, services) =>
{
var retryPolicy = Policy.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(response => {
//此处实现处理改异常的逻辑
return true;
}).WaitAndRetryAsync(,t => TimeSpan.FromMilliseconds()); services.AddHttpClient<RequestClient>()
.AddPolicyHandler(retryPolicy);
})
retryPolicy:发生HttpRequestException的异常,并且OrResult返回结果为true,采用这个策略

  c. AddPolicyHandlerFromRegistry

  先注册策略表服务,为策略表添加策略,最后通过AddPolicyHandlerFromRegistry方法选用某个或几个策略

.ConfigureServices((context, services) =>
{
//注册,策略表服务
var registry = services.AddPolicyRegistry();
//创建策略
var retryPolicy = Policy.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(response => {
//此处实现处理改异常的逻辑
return true;
}).WaitAndRetryAsync(, t => TimeSpan.FromMilliseconds());
registry.Add("registry1", retryPolicy);
services.AddHttpClient<RequestClient>()
.AddPolicyHandlerFromRegistry("registry1");
})

  添加多个 Polly 处理程序嵌套 Polly 策略以增强功

    分别定义三种策略,timeoutPolicy,noOpPolicy,retryPolicy 通过策略表的方式和自定义。添加多个策略。

.ConfigureServices((context, services) =>
{
//注册,策略表服务
var registry = services.AddPolicyRegistry();
//创建策略
var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>();//10秒超时
var noOpPolicy = Policy.NoOpAsync().AsAsyncPolicy<HttpResponseMessage>();//有时我们也需要一个没有任何行为的策略,Polly系统默认提供了一个.
var retryPolicy = Policy.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(response => {
//此处实现处理改异常的逻辑
return true;
}).WaitAndRetryAsync(, t => TimeSpan.FromMilliseconds());
registry.Add("registry1", retryPolicy);
registry.Add("registry2", timeoutPolicy);
services.AddHttpClient<RequestClient>()
.AddPolicyHandlerFromRegistry("registry1")
.AddPolicyHandler(retryPolicy)
.AddPolicyHandler(timeoutPolicy);
})

.Net Core 使用Http请求及基于 Polly 的处理故障的更多相关文章

  1. asp.net core 2.0 web api基于JWT自定义策略授权

    JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端 ...

  2. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  3. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  4. Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:

    Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件: public static String post(String actionU ...

  5. .Net Core 项目区域请求设置

    .net core 和asp.net MVC区域请求有个区别,这里重点记录一下 asp.net MVC 区域请求直接是/区域名称/控制名称/方法名称,其他不需要设置任何东西,而Core 项目这样请求路 ...

  6. Core篇——初探Core的Http请求管道&&Middleware

    目录: 1.Core 处理HTTP请求流程 2.中间件(Middleware)&&处理流程 3.创建自定义中间件&&模拟Core的请求管道 Core 处理HTTP请求流 ...

  7. .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml)

    .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml) 首先设置 Startup.cs 文件 配置 ConfigureServices services .Add ...

  8. .Net Core 发送https请求/.net core 调用数字证书 使用X509Certificate2

    .Net Core 发送https请求 .net core 调用数字证书 使用X509Certificate2 .NET下面的 .netfromwork使用和asp.net core下使用方式不一样 ...

  9. ASP.NET Core如何限制请求频率

    原文:ASP.NET Core如何限制请求频率 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.ne ...

随机推荐

  1. WPF的逻辑树和视觉树

    原文:WPF的逻辑树和视觉树 这部分的内容来自于即将出版的新书<WPF Unleashed>的第三章样章.关于什么是逻辑树,我们先看下面的一个伪XAML代码的例子: <Window ...

  2. C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享

    原文:C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享 曾经我做office,不想依赖别人dll,就使用了 Type.GetTypeFromProgID 可以根 ...

  3. 【C#】简单解决PathTooLong的Exception

    原文:[C#]简单解决PathTooLong的Exception 前提 windows系统路径的最大长度限制是260个字符(听说.Net 4.6.2,取消了这个限制),而Linux或者Unix系统的好 ...

  4. dataGrid 源更新 事件

    DataGrid myGrid = new DataGrid(); CollectionView myCollectionView = (CollectionView)CollectionViewSo ...

  5. Linux学习之“vfork函数”

    为什么使用vfork()? 希望父子进程执行不同的代码.例如: 网络服务程序中,父进程等待客户端的服务请求,当请求达到时,父进程调用fork,使子进程处理该次请求,而父进程继续等待下一个服务请求到达. ...

  6. ThreadPoolExecutor的一点理解 专题

    corePoolSize(maxActiveThreadSize):线程池大小,决定着新提交的任务是新开线程云执行还是放到任务队列中,也是线程池的最最核心的参数.一般线程池开始时是没有线程的,只有当任 ...

  7. 记住以下10条,Linux磁盘与文件系统管理无忧矣

    1.查看当前Linux系统所支持的文件系统:ls -l /lib/modules/$(uname -r)/kernel/fs:目前已加载到内存中支持的文件系统:cat /proc/filesystem ...

  8. C++界面库(十几种,很全)

    刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG  Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自 ...

  9. python之datetime

    一.获取当前日期 >>> from datetime import datetime >>> now=datetime.now() >>> pri ...

  10. MQ消息队列搭建命令及方法

    MQ 是一款稳定.安全又可靠的消息传递中间件.它使用消息和队列来支持应用程序.系统.服务和文件之间的信息交换.它可以简化和加速多个平台中不同应用程序和业务数据的集成.支持各种 API 和语言,并可以在 ...