.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使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解.NET Core 使用HttpClient SSL请求出错的解决办法

    问题 使用 HTTP Client 请求 HTTPS 的 API 时出现 The certificate cannot be verified up to a trusted certification authority 异常,并且证书已经传入. 下面就是问题代码: public class Program { public static void Main(string[] args) { var url = @"https://xxx.xxx.xxx.xxx:xxxx/xxx-web/se

  • .NET Core中HttpClient的正确打开方式

    前言 在 Asp.Net Core 1.0 时代,由于设计上的问题, HttpClient 给开发者带来了无尽的困扰,用 Asp.Net Core 开发团队的话来说就是:我们注意到,HttpClient 被很多开发人员不正确的使用.得益于 .Net Core 不断的版本快速升级: 问题来源 长期以来,.NET开发者都通过下面的方式发送http请求: using (var httpClient = new HttpClient()) { var response = await httpClien

  • .NET Core使用HttpClient进行表单提交时遇到的问题

    问题# 在开发微信支付的小微商户进件接口时,需要通过表单来上传身份证图片等数据.在微信支付接口文档也说明了,需要使用 multipart/form-data 的方式发送请求..NET 提供了 MultipartFormDataContent 类型,帮助我们构建表单请求,故有以下代码: var form = new MultipartFormDataContent() { {new StringContent("Value"),"Name}, {new ByteArrayCon

  • Asp.Net Core2.1前后使用HttpClient的两种方式

    前言 在.Net Core应用开发中,调用第三方接口也是常有的事情,HttpClient使用人数.使用频率算是最高的一种了,在.Net Core中,HttpClient的使用方式随着版本的升级也发生了一些变化,本次就讲解一下Asp.Net Core2.1前后使用的两种方式. 一.原先HttpClient使用方式 一般来讲,喜欢要用的时候才会选择去获取资源,因此,当在有需求时才会用HttpClient去调用资源,便会使用如下这种方式或其它方式获取资源. //do something... usin

  • .Net Core下HTTP请求IHttpClientFactory示例详解

    使用方式 IHttpClientFactory有四种模式: 基本用法 命名客户端 类型化客户端 生成的客户端 基本用法 在 Startup.ConfigureServices 方法中,通过在 IServiceCollection 上调用 AddHttpClient 扩展方法可以注册 IHttpClientFactory services.AddHttpClient(); 注册之后可以像依赖注入DI似得在类中通过构造函数注入形式使用,伪代码: class A { private readonly

  • .NET Core中使用HttpClient的正确姿势

    前言 为了更方便在服务端调用 HTTP 请求,微软在 .NET Framework 4.x 的时候引入了 HttpClient.但 HttpClient 有很多严重问题,一直饱受诟病,比如 InfoQ 的这篇文章 t.cn/Evzy80y,吐槽了 HttpClient 不能立即关闭连接.性能消耗严重等的问题. Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅是客户端发送Http请求变得容易,而且也方便了开发人员

  • ASP.NET Core针对一个使用HttpClient对象的类编写单元测试详解

    介绍 几年前,微软引入了HttpClient类来替代HttpWebRequest来发送Web请求.这个新的类更易于使用,更加简洁,更具有异步性,且易于扩展. HttpClient类有一个可以接受HttpMessageHandler类对象的构造函数.HttpMessageHandler类对象可以接受一个请求(HttpRequestMessage), 并返回响应(HttpResponseMessage).它的功能完全取决于它的实现.默认情况下HttpClient使用的是HttpClientHandl

  • .net Core 使用IHttpClientFactory请求实现

    导读:本文已添加在 晨曦微服务之旅 ,现在自己在尝试微服务架构,一边学边做项目快速的进入状态.当然在学习的过程中会将自己学到的知识进行分享. 一.为什么不用HttpClient 1.HttPClient使用完之后不会立即关闭开启网络连接时会占用底层socket资源,但在HttpClient调用其本身的Dispose方法时,并不能立刻释放该资源 2.如果频繁的使用HttpClient,频繁的打开链接,关闭链接消耗就会很大. 二.解决方案 1.我们可以延长HttpClient的生命周期,比如对其建一

  • .NET Core 2.1中HttpClientFactory的最佳实践记录

    前言 ASP.NET Core 2.1中出现一个新的HttpClientFactory功能, 它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一些常见问题. 介绍 在.NETCore平台的2.1新增了HttpClientFactory,虽然HttpClient这个类实现了disposable,但使用它的时候用声明using包装块的方式通常不是最好的选择.处理HttpClient,底层socket套接字不会立即释放.该HttpClient类是专为多个请求

  • .NET CORE HttpClient的使用方法

    前言 自从HttpClient诞生依赖,它的使用方式一直备受争议,framework版本时代产生过相当多经典的错误使用案例,包括Tcp链接耗尽.DNS更改无感知等问题.有兴趣的同学自行查找研究.在.NETCORE版本中,提供了IHttpClientFactory用来创建HttpClient以解决之前的种种问题.那么我们一起看一下它的用法. 使用方式 基本用法. 直接注入IHttpClientFactory 命名客户端.注入IHttpClientFactory并带有名称,适用于需要特定的客户端配置

  • .Net Core HttpClient处理响应压缩详细

    目录 一.使用方式 二.源码探究 前言: 在ASP.NET Core服务端处理关于响应压缩的请求,服务端的主要工作就是根据Content-Encoding头信息判断采用哪种方式压缩并返回.之前在群里有人问道过,现在的网络带宽这么高了还有必要在服务端针对请求进行压缩吗?确实,如今分布式和负载均衡技术这么成熟,很多需要处理高并发大数据的场景都可以通过增加服务器节点来进行.但是,在资源受限的情况下,或者是还没必要为了某一个点去增加新的服务器节点的时候,我们还是要采用一些程序本身的常规处理手段来进行处理

  • Linux下core文件的使用方法详解

    前言 有时候程序会异常退出而不带任何日志,此时就可以使用 code 文件进行分析,它会记录程序运行的内存,寄存器,堆栈指针等信息 什么是core文件 通常在 Linux 下遇到程序异常退出或者中止,我们都会使用 core 文件进行分析,其中包含了程序运行时的内存,寄存器,堆栈指针等信息,格式为 ELF ,可以理解是程序工作当前状态转储成一个文件,通过工具分析这个文件,我们可以定位到程序异常退出或者终止时相应的堆栈调用等信息,为解决问题提供帮助. 使用core文件调试 生成方法 查看当前 core

  • 在阿里云函数计算上部署.NET Core 3.1的方法

    使用阿里云ECS或者其他常见的VPS服务部署应用的时候,需要手动配置环境,并且监测ECS的行为,做补丁之类的,搞得有点复杂.好在很多云厂商(阿里云.Azure等)提供了Serverless服务,借助于Serverless,开发人员可以更加专注于代码的开发,减少运维的成本. Azure的部署直接集成在了VS中,非常方便,本文主要介绍一下使用ASP.NET CORE 3.1部署在阿里云Serverless(函数计算)的内容. 准备 阿里云的函数计算提供了很多运行库,对.NET的支持现在到ASP.NE

  • ASP.NET Core Authentication认证实现方法

    追本溯源,从使用开始 首先看一下我们通常是如何使用微软自带的认证,一般在Startup里面配置我们所需的依赖认证服务,这里通过JWT的认证方式讲解 public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(authOpt => { authOpt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;

  • 在IIS上部署ASP.NET Core Web API的方法步骤

    对于本文,我想与您分享有关如何在IIS上部署ASP.NET Core Web API的指南.我将指导您安装Visual Studio 2019,.NET Core Runtime 3.0.我还确保我逐步引导您在服务器(Web IIS)中启用它,使用no受管代码选项创建新的应用程序池,创建ASP.NET Core Web API项目以及发布ASP.NET Core Web API. 了解并遵循正确的步骤来准备开发和部署环境后,在IIS上部署ASP.NET Core Web API就是一件容易的事.

  • 使用 HttpReports 监控 .NET Core 应用程序的方法

    简介 HttpReports 基于.NET Core 开发的APM监控系统,使用MIT开源协议,主要功能包括,统计, 分析, 可视化, 监控,追踪等,适合在中小项目中使用. github:https://github.com/dotnetcore/HttpReports 我也很荣幸在.NET Conf 2020 大会上, 做了简单的分享,开源不易,感兴趣的同学欢迎Star,支持一下... 在线预览: http://apm.nonop.cn/ 账号: admin 密码 123456 项目结构 用户

  • Spring远程调用HttpClient/RestTemplate的方法

    一.HttpClient 两个系统间如何互相访问?两个tomcat上的项目如何互相访问? 采用HttpClient实现跨系统的接口调用. 介绍: 官网:http://hc.apache.org/index.html 现在也叫:HttpComponents HttpClient可以发送get.post.put.delete....等请求 使用: 导入坐标 <dependency> <groupId>org.apache.httpcomponents</groupId> &

  • 时间轻松学会.NET Core操作ElasticSearch7的方法

    在互联网上,随处可见的搜索框.背后所用的技术大多数就是全文检索. 在全文检索领域,常见的库/组件有:Lucene.Solr.Sphinx.ElasticSearch等. 简单对比几种全文引擎的区别 Lucene是一个基于Java开发的全文检索基础包,使用起来繁杂,且默认不支持分布式检索 Solr是基于Lucene开发的一个搜索工具.抽象度更高,使用更简单,且提供一个控制面板. ElasticSearch也是基于Lucene开发的.同样是高度抽象,并提供了一个非常强大的DSL检索功能,可以很方便的

  • ASP.NET Core基础之Main方法讲解

    为什么ASP.NET Core采用Main方法? 需要记住的最重要的一点是,ASP.NET Core Web 应用程序最初作为控制台应用程序启动,Main() 方法是应用程序的入口点.因此,当我们执行ASP.NET Core Web应用程序时,首先它寻找 Main() 方法,这是执行开始的方法.然后,Main()方法将ASP.NET配置并启动它.此时,应用程序将成为ASP.NET Core Web应用程序. 如果进一步查看 Main() 方法的正文,则会发现它通过将命令行参数 args 作为参数

随机推荐