自从HttpClient诞生依赖 , 它的使用方式一直备受争议 , framework版本时代产生过相当多经典的错误使用案例 , 包括Tcp链接耗尽、DNS更改无感知等问题 。有兴趣的同学自行查找研究 。在.NETCORE版本中 , 提供了IHttpClientFactory用来创建HttpClient以解决之前的种种问题 。那么我们一起看一下它的用法 。
使用方式注:这种方式经测试貌似不适用控制台程序 。
【.NET CORE HttpClient使用】示例代码
public void ConfigureServices(IServiceCollection services){ //普通注入 serviceCollection.AddHttpClient();//命名注入serviceCollection.AddHttpClient(Constants.SERVICE_USERACCOUNT, (serviceProvider, c) =>{var configuration = serviceProvider.GetRequiredService<IConfiguration>();c.BaseAddress = new Uri(configuration.GetValue<string>("ServiceApiBaseAddress:UserAccountService")); }); //类型化客户端 services.AddHttpClient<TypedClientService>();}public class AccreditationService{ private IHttpClientFactory _httpClientFactory; private const string _officialAccreName = "manage/CommitAgencyOfficialOrder"; private const string _abandonAccUserName = "info/AbandonUserAccreditationInfo";public AccreditationService(IHttpClientFactory clientFactory){_httpClientFactory = clientFactory;}public async Task<string> CommitAgentOfficial(CommitAgencyOfficialOrderRequest request){//使用factory 创建httpclientvar httpClient = _httpClientFactory.CreateClient(Constants.SERVICE_ACCREDITATION);var response = await httpClient.PostAsJsonAsync(_officialAccreName, request);if (!response.IsSuccessStatusCode) return string.Empty;var result = await response.Content.ReadAsAsync<AccreditationApiResponse<CommitAgencyOfficialOrderResult>>();if (result.ReturnCode != "0") return string.Empty;return result.Data.OrderNo;}}
命名化客户端方式直接注入的是HttpClient而非HttpClientFactory
public class TypedClientService{private HttpClient _httpClient;public TypedClientService(HttpClient httpClient){_httpClient = httpClient;}}
Logging通过IHttpClientFactory创建的客户端默认记录所有请求的日志消息 , 并每个客户端的日志类别会包含客户端名称 , 例如 , 名为 MyNamedClient 的客户端记录类别为“System.Net.Http.HttpClient.MyNamedClient.LogicalHandler”的消息 。
请求管道同framework时代的HttpClient一样支持管道处理 。需要自定义一个派生自 DelegatingHandler 的类 , 并实现 SendAsync 方法 。例如下面的例子
public class ValidateHeaderHandler : DelegatingHandler{protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken){if (!request.Headers.Contains("X-API-KEY")){return new HttpResponseMessage(HttpStatusCode.BadRequest){Content = new StringContent("You must supply an API key header called X-API-KEY")};}return await base.SendAsync(request, cancellationToken);}}
在AddHttpClient的时候注入进去
public void ConfigureServices(IServiceCollection services){services.AddTransient<ValidateHeaderHandler>();services.AddHttpClient("externalservice", c =>{// Assume this is an "external" service which requires an API KEYc.BaseAddress = new Uri("https://localhost:5001/");}).AddHttpMessageHandler<ValidateHeaderHandler>();}
原理和生存周期IHttpClientFactory每次调用CreateHttpClient都会返回一个全新的HttpClient实例 。而负责http请求处理的核心HttpMessageHandler将会有工厂管理在一个池中 , 可以重复使用 , 以减少资源消耗 。HttpMessageHandler默认生成期为两分钟 。可以在每个命名客户端上重写默认值:
public void ConfigureServices(IServiceCollection services){services.AddHttpClient("extendedhandlerlifetime").SetHandlerLifetime(TimeSpan.FromMinutes(5));}
文章插图
Polly支持Polly是一款为.NET提供恢复能力和瞬态故障处理的库 , 它的各种策略应用(重试、断路器、超时、回退等) 。IHttpClientFactory增加了对其的支持 , 它的nuget包为: Microsoft.Extensions.Http.Polly 。注入方式如下:
public void ConfigureServices(IServiceCollection services){services.AddHttpClient<UnreliableEndpointCallerService>().AddTransientHttpErrorPolicy(p =>p.WaitAndRetryAsync(3, _ => TimeSpan.FromMilliseconds(600)));}
更详细的结合使用请参考: https://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory推荐阅读
- Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页
- 会声会影视频编辑
- hms core是什么软件可以卸载吗?hms core是什么软件有用吗?
- ASP.NET Core 6.0 添加 JWT 认证和授权
- 如何在树莓派4开发板上使用Windows 10 IoT Core?
- 在.NET和.NET Core应用程序中优雅的实现后台任务——Hangfire
- 内网渗透基础——命令行下安装Microsoft .NET Framework
- 在linux系统下运行 .net core 程序
- 常见加密算法 「asp.net core 系列」12 数据加密算法
- linux下开发基于.net的三维绘图程序