.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 ...
随机推荐
- C# Winform制作虚拟键盘,支持中文
原文:C# Winform制作虚拟键盘,支持中文 最近在做一个虚拟键盘功能,代替鼠标键盘操作,效果如下: 实现思路: 1 构建中文-拼音 数据库, ...
- 基于树莓派的微型气象站设计与开发(Windows 10 IoT Core)
前言 树莓派(Raspberry Pi,RPi)是专门为学生计算机编程教育而设计,只有信用卡大小的卡片式电脑,可以运行Linux或者Windows 10 IoT Core操作系统.本文将利用树莓派和U ...
- Linux下C语言RPC(远程过程调用)编程实例
在查看libc6-dev软件包提供的工具(用 dpkg -L libc6-dev 命令)的时候,发现此软件包提供了一个有用的工具rpcgen命令.通过rpcgen的man手册看到此工具的作用是把RPC ...
- Win8 Metro(C#)数字图像处理--2.42图像光照效果算法
原文:Win8 Metro(C#)数字图像处理--2.42图像光照效果算法 [函数名称] 图像光照效果 SunlightProcess(WriteableBitmap src,int X,in ...
- C/C++网络编程时注意的问题小结
1.网络编程在自己定义结构体实现协议的时候,一定要注意字节对齐这个问题.否则sizeof和强制转换指针的时候都会出现很难发现的bug. 什么是字节对齐自行百度. #pragma pack (1)//字 ...
- iOS学习总结之ARC和非ARC的单例模式实现
iOS单例模式的实现 首先我们要明白下面三个问题: 什么是单例模式 单例模式的优点 如何实现单例模式 1.什么是单例模式 单例模式(Singleton):单例模式确保对于一个给定的类只有一个实例存在, ...
- ORACLE 错误 ora-01830 解决方法
http://www.cnblogs.com/BetterWF/archive/2012/06/20/2556442.html 错误产生原因:date类型不能包含秒以后的精度. 如日期:2012-06 ...
- asp.net 调用带证书的webservice解决办法
最近在朋友弄一个调整省政府政务工作流的程序.. 需要把当前的信息推送到政务网上,采用的是带证书的https webservice.. 下面说一下实现过程 第一步,引用webservice地址,删除we ...
- 【Windows10 IoT开发系列】“Hello,World!”指导
原文:[Windows10 IoT开发系列]"Hello,World!"指导 本文主要是介绍使用C#来开发一个可以运行在Raspberry Pi2上的一个基本项目. 1.在启动V ...
- LFS Linux From Scratch 笔记(经验非教程)
做了一个自己的DIY Linux系统.从编译每一行代码,建立每一个文件系统结构开始. 创造自己的GNU/Linux系统,不同于任何发行版.按照的教程是来自 linuxfromscratch.org 来 ...