.net Core 使用IHttpClientFactory请求
导读:本文已添加在晨曦微服务之旅,现在自己在尝试微服务架构,一边学边做项目快速的进入状态。当然在学习的过程中会将自己学到的知识进行分享。
一、为什么不用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 容器结合使用,更为灵活。
//修改默认的生命周期
services.AddHttpClient()
.SetHandlerLifetime(TimeSpan.FromMinutes());
四、HttpClientFactory的使用
一、第一种使用方式
- 在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请求的更多相关文章
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程
简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...
- .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 ...
- 理解ASP.NET Core - 发送Http请求(HttpClient)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 前言 在.NET中,我们有很多发送Http请求的手段,如HttpWebRequest.WebC ...
- ASP.NET/MVC/Core的HTTP请求流程
ASP.NET HTTP管道(Pipeline)模型 1. 先讲一点,再深刻思考 一般我们都在写业务代码,优化页面,优化逻辑之间内徘徊.也许我们懂得HTTP,HTTPS的GET,POST,但是我们大部 ...
- 如何测量并报告ASP.NET Core Web API请求的响应时间
介绍 大家都知道性能是API的流行语.而相应时间则是API性能的一个重要并且可测量的参数.在本文中,我们将了解如何使用代码来测量API的响应时间,然后将响应时间数据返回到客户端. 作者:依乐祝 原文地 ...
随机推荐
- Ant Design的Form组件中FormItem名称相同引起的问题
1.问题描述 在使用Antd组件Form表单的过程中,会出现FormItem同名的情况,此时要特别注意同名引起的表单行为异常问题,主要表现在以下方面: (1)同名表单项的值共享,并且其中一个的值改变, ...
- Vue实现同级组件的通信
一.文件结构 二.vue.js 打开此链接 https://cdn.bootcss.com/vue/2.6.10/vue.js 复制粘贴页面的所有内容 三.index.html <!DOCTYP ...
- linux 运行处理者
如同前面建议的, 当内核收到一个中断, 所有的注册的处理者被调用. 一个共享的处理者 必须能够在它需要的处理的中断和其他设备产生的中断之间区分. 使用 shared=1 选项来加载 short 安装了 ...
- ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(13)之会员登录注册
源码下载地址:http://www.yealuo.com/Sccnn/Detail?KeyValue=c891ffae-7441-4afb-9a75-c5fe000e3d1c 会员中心,是我们与用户交 ...
- linux 一个使用整页的 scull: scullp
为了真实地测试页分配, 我们已随其他例子代码发布了 scullp 模块. 它是一个简化的 scull, 就像前面介绍过的 scullc. scullp 分配的内存量子是整页或者页集合: scullp_ ...
- 洛谷——P1160 队列安排(链表的基础操作)
#include<bits/stdc++.h> using namespace std; ]; list<int> stus; list<];//用来存放每一项的迭代器 ...
- Typescript 最佳实践
文章列表: <一>大话 TypeScript 基本类型 <二>大话 Typescript 枚举 <三>大话 Typescript 接口 <四>大话 Ty ...
- 掌握这些,ArrayList就不用担心了!
关于ArrayList的学习 ArrayList属于Java基础知识,面试中会经常问到,所以作为一个Java从业者,它是你不得不掌握的一个知识点.
- spring boot(二)热部署
1.打开idea的设置界面 File | Settings > Build, Execution, Deployment > Compiler 2.勾选Buildproject antom ...
- 解决Coursera视频无法观看的三种方法(亲测有效)
最近在coursera上课时出现了视频黑屏,网页缓冲,无法观看等问题,经过查询发现很多人也有同样的问题.对于不同的原因,一般来说解决方法也不同.这里有三种办法,大家可以挨个尝试,肯定有一个 ...