导读:本文已添加在晨曦微服务之旅,现在自己在尝试微服务架构,一边学边做项目快速的进入状态。当然在学习的过程中会将自己学到的知识进行分享。

一、为什么不用HttpClient

        1.HttPClient使用完之后不会立即关闭开启网络连接时会占用底层socket资源,但在HttpClient调用其本身的Dispose方法时,并不能立刻释放该资源

2.如果频繁的使用HttpClient,频繁的打开链接,关闭链接消耗就会很大。

二、解决方案

        1.我们可以延长HttpClient的生命周期,比如对其建一个静态的对象

private static HttpClient Client = new HttpClient();

2.或者使用单例模式,至于你使用哪一种单例模式就看你自己了,这里就不细将了。因为这样感觉起来不是很舒服

三、HttpClientFactory

       1.在.NET Core 2.1版本之后引入的 HttpClientFactory解决了HttpClient的所有痛点。有了 HttpClientFactory,我们不需要关心如何创建HttpClient,又如何释放它。通过它可以创建具有特定业务的HttpClient,而且可以很友好的和 DI 容器结合使用,更为灵活。

    2.HttpClientFactory 创建的HttpClient,也即是HttpClientHandler,只是这些个HttpClient被放到了“池子”中,工厂每次在create的时候会自动判断是新建还是复用。(默认生命周期为2min,默认的生命周期可以修改)

   //修改默认的生命周期
services.AddHttpClient()
.SetHandlerLifetime(TimeSpan.FromMinutes());

四、HttpClientFactory的使用 

    一、第一种使用方式

  1. 在Startup.cs中进行注册

                //注册http请求服务
    services.AddHttpClient();

2.Httphelper请求辅助类中使用

/// <summary>
/// 注入http请求
/// </summary>
private readonly IHttpClientFactory httpClientFactory;
public HttpHelp(IHttpClientFactory _httpClientFactory)
{
httpClientFactory = _httpClientFactory;
} // <summary>
// Get请求数据
// <para>最终以url参数的方式提交</para>
// </summary>
// <param name="parameters">参数字典,可为空</param>
// <param name="requestUri">例如/api/Files/UploadFile</param>
// <returns></returns>
public async Task<string> Get(Dictionary<string, string> parameters, string requestUri, string token)
{
//从工厂获取请求对象
var client = httpClientFactory.CreateClient();
//添加请求头
if (!string.IsNullOrWhiteSpace(token))
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
}
client.DefaultRequestHeaders.Add("Content-Type", "application/json; charset=utf-8");
//拼接地址
if (parameters != null)
{
var strParam = string.Join("&", parameters.Select(o => o.Key + "=" + o.Value));
requestUri = string.Concat(requestUri, '?', strParam);
}
client.BaseAddress = new Uri(requestUri);
return client.GetStringAsync(requestUri).Result;
}

3.然后我们在Startup.cs对相对的类进行注册就可以了使用了。

      二、使用命名客户端

     1.在Startup.cs中进行注册,这个注册可以存在多个。以创建名字区分

services.AddHttpClient("github", c =>
{
c.BaseAddress = new Uri("https://xxxxxxx.com/");
// Github API versioning
c.DefaultRequestHeaders.Add("Content-Type", "application/json; charset=utf-8");
// Github requires a user-agent
c.DefaultRequestHeaders.Add("Authorization", "asfasfasdsgdsfsdfsdafasfas");
});

2.使用方式和上面的一样只要

/// <summary>
/// 注入http请求
/// </summary>
private readonly IHttpClientFactory httpClientFactory;
public HttpHelp(IHttpClientFactory _httpClientFactory)
{
httpClientFactory = _httpClientFactory;
} // <summary>
// Get请求数据
// <para>最终以url参数的方式提交</para>
// </summary>
// <param name="parameters">参数字典,可为空</param>
// <param name="requestUri">例如/api/Files/UploadFile</param>
// <returns></returns>
public async Task<string> Get(Dictionary<string, string> parameters, string requestUri, string token)
{
//从工厂获取请求对象 声明自己创建哪一个httpClient客户端
var client = httpClientFactory.CreateClient("github");
//添加请求头
if (!string.IsNullOrWhiteSpace(token))
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
}
client.DefaultRequestHeaders.Add("Content-Type", "application/json; charset=utf-8");
//拼接地址
if (parameters != null)
{
var strParam = string.Join("&", parameters.Select(o => o.Key + "=" + o.Value));
requestUri = string.Concat(requestUri, '?', strParam);
}
client.BaseAddress = new Uri(requestUri);
return client.GetStringAsync(requestUri).Result;
}

 三、类型化客户端

           1.创建一个类

public class HttpClienService
{
public HttpClient Client { get; }
public HttpClienService(HttpClient client)
{
client.BaseAddress = new Uri("https://xxxx.com/");
// GitHub API versioning
client.DefaultRequestHeaders.Add("Authorization",
"xxxxxxxxxxxx");
// GitHub requires a user-agent
client.DefaultRequestHeaders.Add("Content-Type",
"application/json; charset=utf-8");
Client = client;
} //这个下面就是编写自己方法,进行调用
}

2.在Startup.cs中进行注册,这个注册可以存在多个。

services.AddHttpClient<classHttp>();
//注册之后,使用依赖注入的方式进行注入,进行使用。

.net Core 使用IHttpClientFactory请求的更多相关文章

  1. 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程

    简述C#中IO的应用   在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...

  2. .Net Core 项目区域请求设置

    .net core 和asp.net MVC区域请求有个区别,这里重点记录一下 asp.net MVC 区域请求直接是/区域名称/控制名称/方法名称,其他不需要设置任何东西,而Core 项目这样请求路 ...

  3. Core篇——初探Core的Http请求管道&&Middleware

    目录: 1.Core 处理HTTP请求流程 2.中间件(Middleware)&&处理流程 3.创建自定义中间件&&模拟Core的请求管道 Core 处理HTTP请求流 ...

  4. .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml)

    .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml) 首先设置 Startup.cs 文件 配置 ConfigureServices services .Add ...

  5. .Net Core 发送https请求/.net core 调用数字证书 使用X509Certificate2

    .Net Core 发送https请求 .net core 调用数字证书 使用X509Certificate2 .NET下面的 .netfromwork使用和asp.net core下使用方式不一样 ...

  6. ASP.NET Core如何限制请求频率

    原文:ASP.NET Core如何限制请求频率 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.ne ...

  7. 理解ASP.NET Core - 发送Http请求(HttpClient)

    注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 前言 在.NET中,我们有很多发送Http请求的手段,如HttpWebRequest.WebC ...

  8. ASP.NET/MVC/Core的HTTP请求流程

    ASP.NET HTTP管道(Pipeline)模型 1. 先讲一点,再深刻思考 一般我们都在写业务代码,优化页面,优化逻辑之间内徘徊.也许我们懂得HTTP,HTTPS的GET,POST,但是我们大部 ...

  9. 如何测量并报告ASP.NET Core Web API请求的响应时间

    介绍 大家都知道性能是API的流行语.而相应时间则是API性能的一个重要并且可测量的参数.在本文中,我们将了解如何使用代码来测量API的响应时间,然后将响应时间数据返回到客户端. 作者:依乐祝 原文地 ...

随机推荐

  1. servicemix-3.2.1 部署异常

    <jbi-task xmlns="http://java.sun.com/xml/ns/jbi/management-message" version="1.0&q ...

  2. 2019-10-10-优雅调试-REST-API-的工具

    title author date CreateTime categories 优雅调试 REST API 的工具 lindexi 2019-10-10 20:9:33 +0800 2019-10-1 ...

  3. linux模块参数

    驱动需要知道的几个参数因不同的系统而不同. 从使用的设备号( 如我们在下一章见到的 ) 到驱动应当任何操作的几个方面. 例如, SCSI 适配器的驱动常常有选项控制标记命令队列 的使用, IDE 驱动 ...

  4. spring security (BCryptPasswordEncoder)加密及判断密码是否相同

    通过BCryptPasswordEncoder的加密的相同字符串的结果是不同的,如果需要判断是否是原来的密码,需要用它自带的方法. 加密: BCryptPasswordEncoder encode = ...

  5. post提交方式为什么要序列化,而Get提交方式就不用?序列化做了什么?

    这是因为后台能够直接处理的数据格式,是一种经过序列化的键值对数据,比如前端要向后台提交三个参数,分别是a=1,b=2,c=3,那么后台接收到的数据就应该是a=1&b=2&c=3(可以看 ...

  6. Linux下tomcat启动成功但是Windows打不开tomcat网址

    前提条件: 1.Linux和Windows都可以相互ping通. 2.Linux下tomcat可以启动,并且在Linux下可以访问8080 出现的问题: 当我在Windows下访问时,无法连接或者出现 ...

  7. Spark in action Spark 以及SparkR的安装配置说明

    Spark以及SparkR的安装(standalone模式) From :ssdutsu @ Inspur Company  suzhiyuan2006@gmail.com 操作系统 CentOS 7 ...

  8. 2019.12.15 QLU and SNDU期末联赛

    题目列表: 1582.柳予欣的舔狗行为 1587.柳予欣的女朋友们在分享水果 1585.柳予欣和她女朋友的购物计划 1579.FFFFFunctions 1588.Zeckendorf 1586.柳予 ...

  9. vue-learning:41 - Vuex - 第二篇:const store = new Vue.Store(option)中option选项、store实例对象的属性和方法

    vuex 第二篇:const store = new Vue.Store(option)中option选项.store实例对象的属性和方法 import Vuex from 'vuex' const ...

  10. <% %>、<%! %>和<%= %>

    <%  %> 此标签内的内容在jsp编译的时候,将被编译成servlet的_jspService()方法.这个方法用作服务器端向客户端输出.因此这对标签里边不能在定义方法了,因为在Java ...