.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 ...
随机推荐
- telerik ChartGrid浅谈
在最近接触的项目中,有很多都是以Chart图表的方式呈现出来的,关于telerik Chart的使用,有几个小点跟大家分享一下. 1:本例子使用的Chart的命名空间为 xmlns:telerik=h ...
- 【摘抄】C# DateTime.Now详解
//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString(& ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第五章 从最常用ButtonStyle开始 - ImageButton
原文:[全面解禁!真正的Expression Blend实战开发技巧]第五章 从最常用ButtonStyle开始 - ImageButton 本章围绕ImageButton深入讨论,为什么是Image ...
- 零元学Expression Blend 4 - Chapter 15 用实例了解互动控制项「Button」I
原文:零元学Expression Blend 4 - Chapter 15 用实例了解互动控制项「Button」I 本章将教大家如何更改Button的预设Template,以及如何在Button内设置 ...
- eclipse 插件编写(四)
前言 前面几篇文章讲了下如果编写简单的eclipse插件,如创建插件项目.编写右键弹出菜单等功能,接下来主要写一下如何生成代码的功能,这一片的功能跟插件本身的编写关联不太大,主要处理插件之后的业务内容 ...
- UWP 设置控件样式四种方法
1.隐式方法,通过仅指定 Style 的 TargetType.(设置全部的Button样式) <Page.Resources > <Style TargetType="B ...
- DIY Delphi 半透明窗体(2)
写文章的时候 脑子有点乱 unit uMainForm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics ...
- <iOS小技巧> 昵称格式判断
一.使用方式 + 如下代码块功能:判断字体,判断字体输入格式 NSString *firstStr = [name substringToIndex:1]; NSArray *num ...
- C++ 王者归来:对编程语言的需求总结为四个:效率,灵活,抽象,生产率(C++玩的是前三个,Java和C#玩的是后两个)
Why C++ ? 王者归来(转载) 因为又有人邀请我去Quora的C2C网站去回答问题去了,这回是 关于 @laiyonghao 的这篇有点争议的博文<2012 不宜进入的三个技术点>A ...
- 创业游戏模拟器 Startup 游戏试玩
买的正版游戏,还在beta阶段.因为对这种经营类的游戏挺感兴趣,结合自己也是做这个行当的.算是一次性通关了吧.我来评价一下这个游戏.足足玩了有5个多小时.从1级玩到15级.解锁了所有的内容.员工从1个 ...