.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 容器结合使用,更为灵活。
2.httpclientfactory 创建的httpclient,也即是httpclienthandler,只是这些个httpclient被放到了“池子”中,工厂每次在create的时候会自动判断是新建还是复用。(默认生命周期为2min,默认的生命周期可以修改)
//修改默认的生命周期 services.addhttpclient() .sethandlerlifetime(timespan.fromminutes(5));
四、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>(); //注册之后,使用依赖注入的方式进行注入,进行使用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之增删改视图(八)
-
创建基于ASP.NET core 3.1 的RazorPagesMovie项目(一)-创建和使用默认的模板
-
使用NuGet将我们的ASP.NET Core类库打包并将程序包(类库)发布到NuGet平台上进行管理
-
在net Core3.1上基于winform实现依赖注入实例
-
[笔记]使用Docker部署.NET Core应用程序
-
使用ASP.NET Core 3.x 构建 RESTful API - 5.1 输入验证
-
.net core web api 添加对session跨域实现
-
百度编辑器上传视频报Http请求错误,.net实现方式
-
详解Asp.net Core 使用Redis存储Session
-
建议收藏:.net core 使用EPPlus导入导出Excel详细案例,精心整理源码已更新至开源模板