.NET CORE HttpClient使用
自从HttpClient诞生依赖,它的使用方式一直备受争议,framework版本时代产生过相当多经典的错误使用案例,包括Tcp链接耗尽、DNS更改无感知等问题。有兴趣的同学自行查找研究。在.NETCORE版本中,提供了IHttpClientFactory用来创建HttpClient以解决之前的种种问题。那么我们一起看一下它的用法。
使用方式
- 基本用法。 直接注入IHttpClientFactory
- 命名客户端。注入IHttpClientFactory并带有名称,适用于需要特定的客户端配置
- 类型化客户端。类似于命名客户端,但不需要名称作为标识,直接和某个服务类绑定在一起。
注:这种方式经测试貌似不适用控制台程序。 - 生成客户端。这种方式相当于在客户端生成对应的代理服务,一般特定的需要才需要这种方式。需要结合第三方库如 Refit 使用。这里不具体介绍。
示例代码
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 创建httpclient
var 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 KEY
c.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
.NET CORE HttpClient使用的更多相关文章
- .NET Core HttpClient调用腾讯云对象存储Web API的"ERROR_CGI_PARAM_NO_SUCH_OP"问题
开门见山地说一下问题的原因:调用 web api 时请求头中多了双引号,请求体中少了双引号. 腾讯云提供的对象存储(COS)C# SDK 是基于 .NET Framework 用 WebRequest ...
- .net core HttpClient 使用之消息管道解析(二)
一.前言 前面分享了 .net core HttpClient 使用之掉坑解析(一),今天来分享自定义消息处理HttpMessageHandler和PrimaryHttpMessageHandler ...
- .Net Core HttpClient处理响应压缩
前言 在上篇文章[ASP.NET Core中的响应压缩]中我们谈到了在ASP.NET Core服务端处理关于响应压缩的请求,服务端的主要工作就是根据Content-Encoding头信息判断采 ...
- .net core HttpClient 使用之掉坑解析(一)
一.前言 在我们开发当中经常需要向特定URL地址发送Http请求操作,在.net core 中对httpClient使用不当会造成灾难性的问题,这篇文章主要来分享.net core中通过IHttpCl ...
- .NET Core HttpClient+Consul实现服务发现
简介 随着.NET Core的不断发展与成熟,基于.NET Core实现微服务的解决方案也越来越多.这其中必然需要注册中心,Consul成为了.NET Core实现服务注册与发现的首选.类似的解决方案 ...
- .NET Core HttpClient源码探究
前言 在之前的文章我们介绍过HttpClient相关的服务发现,确实HttpClient是目前.NET Core进行Http网络编程的的主要手段.在之前的介绍中也看到了,我们使用了一个很重要的 ...
- .NET Core HttpClient请求异常详细情况分析
前言 最近项目上每天间断性捕获到HttpClient请求异常,感觉有点奇怪,于是乎观察了两三天,通过日志以及对接方沟通确认等等,查看对应版本源码,尝试添加部分配置发布后,观察十几小时暂无异常情况出现, ...
- asp.net Core HttpClient 出现Cannot access a disposed object. Object name: 'SocketsHttpHandler' 的问题。
ASP.NET Core 部署在Centos 中 偶尔出现 One or more errors occurred. (Cannot access a disposed object.Object n ...
- .Net Core HttpClient 忽略https证书提醒
在测试中经常会遇到请求一些https的url,但又没有本地证书,这时候可以用下面的方法忽略警告 var httpclientHandler = new HttpClientHandler(); htt ...
随机推荐
- pycharm中导入包失败的解决办法
将鼠标移动到requests处,出现如下提示 按住alt+enter键,点击install package requests即可安装requests包 安装成功后
- asp.net core 发布包含文件
这样这个文件在发布的时候,就会包含进去了.
- Angular2-------Error: Unexpected value ‘undefined’ declared by the module ‘模块名
请检查[app.module.ts]文件中的[declarations]模块最后是否多了一个逗号 (完)
- java语言进阶(五)_异常
第一章 异常 1.1 异常概念 异常 :指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了 ...
- 复盘鼎甲科技2020web开发工程师-笔试题(校招)
复盘鼎甲科技2020web开发工程师-笔试题(校招) 本试卷以W3C规范为准,JavaScript使用ES5标准,除特别说明外,不考虑各个浏览器之间差异. 一.多项选择题 以下标签是行内元素(inli ...
- 性能测试之Jmeter中场景设置与启动方式
Jmeter场景设置与启动方式 性能测试场景是用来模拟模拟真实用户操作的工作单元,所以场景设计一定要切合用户的操作逻辑,jmeter主要是通过线程组配合其他组件来一起完成场景的设置. 线程组设置 Jm ...
- adb devices 不能连接设备 could not install *smartsocket* listener
cmd以管理员身份运行命令adb devices 或adb reverse tcp:8081 tcp:8081,无法连接设备,出现上图信息. 输入命令:adb kill-server 再输入:adb ...
- 静态方法中注入bean
@Componentpublic class ScriptExecuteContent { @Autowired private static SignRepository signRepositor ...
- OSI物理层之数据通信基础知识
@ 目录 物理层的基本概念 物理层的主要任务 数据通信的基础知识 典型的数据通信模型 相关术语 信道的基本概念 基带(base band)信号和带通(band pass)信号 几种最基本的调制方法 常 ...
- Spring入门案例
一.Spring基本介绍 1.什么是Spring Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control: 反转控制 ...