.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 ...
随机推荐
- Win8 Metro(C#)数字图像处理--2.52图像K均值聚类
原文:Win8 Metro(C#)数字图像处理--2.52图像K均值聚类 [函数名称] 图像KMeans聚类 KMeansCluster(WriteableBitmap src,i ...
- HTTP协议解析(格式和举例十分清楚)
掌握HTTP虽然不是必须的,但是如果你知道它的工作原理,那么在学习JSP开发中的某些知识就可以易如反掌了. 一,HTTP协议详解之URL篇 http(超文本传输协议)是一个基于请求与响应模式的.无状态 ...
- ARTS 1.14 - 1.18
期望: 每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! Algorithm: 学习算法 Two Sum IV - In ...
- Windows10 1607 x64/x86 + Office 2016 Win/Mac + KMS激活/安装密钥汇总
各位观众,这里汇总了一份最新微软系统和办公软件的资源清单,希望对你们有帮助. Windows10 1607 For x64 ed2k://|file|cn_windows_10_multiple_ed ...
- android 录屏
录屏,google了一下,记录下来,以免FQ android 4.4 录屏可通过adb:adb shell screenrecord /sdcard/video.mp4 (未测试) android 5 ...
- WPF TextBlock 文字超长截断并显示省略符号
<TextBlock x:Name=" FontSize="9pt" Margin="0 2 0 0 " VerticalAlignment=& ...
- 二叉树基本操作C代码
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct ChainTree) struct ChainTr ...
- RocketMQ配置
安装&配置 1.Clone&Build git clone -b develop https://github.com/apache/incubator-rocketmq.git cd ...
- Model1简介
Model1模型出现前,整个Web应用的情况:几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做出响应. 弊端:在界面层充斥着大量的业务逻辑的代码和数据访问层的代码,Web程序 ...
- 屏蔽按CapsLock键切换到大写时,编辑框自动弹出的提示(UnregisterClass(TOOLTIPS_CLASS)后,重新设置WndProc并注意返回值)
WNDPROC OldProc; LPCTSTR lpStr = TEXT("保持大写锁定打开可能会使您错误输入密码"); LRESULT CALLBACK WindowProc( ...