.net Core 使用IHttpClientFactory请求实现
导读:本文已添加在 晨曦微服务之旅,现在自己在尝试微服务架构,一边学边做项目快速的进入状态。当然在学习的过程中会将自己学到的知识进行分享。
一、为什么不用HttpClient
1.HttPClient使用完之后不会立即关闭开启网络连接时会占用底层socket资源,但在HttpClient调用其本身的Dispose方法时,并不能立刻释放该资源
2.如果频繁的使用HttpClient,频繁的打开链接,关闭链接消耗就会很大。
二、解决方案
1.我们可以延长HttpClient的生命周期,比如对其建一个静态的对象
privatestaticHttpClientClient=newHttpClient();
2.或者使用单例模式,至于你使用哪一种单例模式就看你自己了,这里就不细将了。因为这样感觉起来不是很舒服
三、HttpClientFactory
1.在.NETCore2.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请求辅助类中使用
//////注入http请求 /// privatereadonlyIHttpClientFactoryhttpClientFactory; publicHttpHelp(IHttpClientFactory_httpClientFactory) { httpClientFactory=_httpClientFactory; } ////Get请求数据 // //最终以url参数的方式提交 //参数字典,可为空 // 例如/api/Files/UploadFile // publicasyncTask Get(Dictionary parameters,stringrequestUri,stringtoken) { //从工厂获取请求对象 varclient=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) { varstrParam=string.Join("&",parameters.Select(o=>o.Key+"="+o.Value)); requestUri=string.Concat(requestUri,'?',strParam); } client.BaseAddress=newUri(requestUri); returnclient.GetStringAsync(requestUri).Result; }
3.然后我们在Startup.cs对相对的类进行注册就可以了使用了。
二、使用命名客户端
1.在Startup.cs中进行注册, 这个注册可以存在多个。以创建名字区分
services.AddHttpClient("github",c=> { c.BaseAddress=newUri("https://xxxxxxx.com/"); //GithubAPIversioning c.DefaultRequestHeaders.Add("Content-Type","application/json;charset=utf-8"); //Githubrequiresauser-agent c.DefaultRequestHeaders.Add("Authorization","asfasfasdsgdsfsdfsdafasfas"); });
2.使用方式和上面的一样只要
//////注入http请求 /// privatereadonlyIHttpClientFactoryhttpClientFactory; publicHttpHelp(IHttpClientFactory_httpClientFactory) { httpClientFactory=_httpClientFactory; } ////Get请求数据 // //最终以url参数的方式提交 //参数字典,可为空 // 例如/api/Files/UploadFile // publicasyncTask Get(Dictionary parameters,stringrequestUri,stringtoken) { //从工厂获取请求对象声明自己创建哪一个httpClient客户端 varclient=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) { varstrParam=string.Join("&",parameters.Select(o=>o.Key+"="+o.Value)); requestUri=string.Concat(requestUri,'?',strParam); } client.BaseAddress=newUri(requestUri); returnclient.GetStringAsync(requestUri).Result; }
三、类型化客户端
1.创建一个类
publicclassHttpClienService { publicHttpClientClient{get;} publicHttpClienService(HttpClientclient) { client.BaseAddress=newUri("https://xxxx.com/"); //GitHubAPIversioning client.DefaultRequestHeaders.Add("Authorization", "xxxxxxxxxxxx"); //GitHubrequiresauser-agent client.DefaultRequestHeaders.Add("Content-Type", "application/json;charset=utf-8"); Client=client; } //这个下面就是编写自己方法,进行调用 }
2.在Startup.cs中进行注册, 这个注册可以存在多个。
services.AddHttpClient(); //注册之后,使用依赖注入的方式进行注入,进行使用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。