.Net Core 使用Http请求及基于 Polly 的处理故障
一、介绍
在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 的处理故障的更多相关文章
- asp.net core 2.0 web api基于JWT自定义策略授权
JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端 ...
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程
简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...
- 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...
- Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:
Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件: public static String post(String actionU ...
- .Net Core 项目区域请求设置
.net core 和asp.net MVC区域请求有个区别,这里重点记录一下 asp.net MVC 区域请求直接是/区域名称/控制名称/方法名称,其他不需要设置任何东西,而Core 项目这样请求路 ...
- Core篇——初探Core的Http请求管道&&Middleware
目录: 1.Core 处理HTTP请求流程 2.中间件(Middleware)&&处理流程 3.创建自定义中间件&&模拟Core的请求管道 Core 处理HTTP请求流 ...
- .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml)
.net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml) 首先设置 Startup.cs 文件 配置 ConfigureServices services .Add ...
- .Net Core 发送https请求/.net core 调用数字证书 使用X509Certificate2
.Net Core 发送https请求 .net core 调用数字证书 使用X509Certificate2 .NET下面的 .netfromwork使用和asp.net core下使用方式不一样 ...
- ASP.NET Core如何限制请求频率
原文:ASP.NET Core如何限制请求频率 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.ne ...
随机推荐
- WPF的逻辑树和视觉树
原文:WPF的逻辑树和视觉树 这部分的内容来自于即将出版的新书<WPF Unleashed>的第三章样章.关于什么是逻辑树,我们先看下面的一个伪XAML代码的例子: <Window ...
- C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享
原文:C# 桌面软件开发-深入学习 [1]- AY-C#人爱学不学-aaronyang技术分享 曾经我做office,不想依赖别人dll,就使用了 Type.GetTypeFromProgID 可以根 ...
- 【C#】简单解决PathTooLong的Exception
原文:[C#]简单解决PathTooLong的Exception 前提 windows系统路径的最大长度限制是260个字符(听说.Net 4.6.2,取消了这个限制),而Linux或者Unix系统的好 ...
- dataGrid 源更新 事件
DataGrid myGrid = new DataGrid(); CollectionView myCollectionView = (CollectionView)CollectionViewSo ...
- Linux学习之“vfork函数”
为什么使用vfork()? 希望父子进程执行不同的代码.例如: 网络服务程序中,父进程等待客户端的服务请求,当请求达到时,父进程调用fork,使子进程处理该次请求,而父进程继续等待下一个服务请求到达. ...
- ThreadPoolExecutor的一点理解 专题
corePoolSize(maxActiveThreadSize):线程池大小,决定着新提交的任务是新开线程云执行还是放到任务队列中,也是线程池的最最核心的参数.一般线程池开始时是没有线程的,只有当任 ...
- 记住以下10条,Linux磁盘与文件系统管理无忧矣
1.查看当前Linux系统所支持的文件系统:ls -l /lib/modules/$(uname -r)/kernel/fs:目前已加载到内存中支持的文件系统:cat /proc/filesystem ...
- C++界面库(十几种,很全)
刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自 ...
- python之datetime
一.获取当前日期 >>> from datetime import datetime >>> now=datetime.now() >>> pri ...
- MQ消息队列搭建命令及方法
MQ 是一款稳定.安全又可靠的消息传递中间件.它使用消息和队列来支持应用程序.系统.服务和文件之间的信息交换.它可以简化和加速多个平台中不同应用程序和业务数据的集成.支持各种 API 和语言,并可以在 ...