.net Core 使用IHttpClientFactory請(qǐng)求實(shí)現(xiàn)
導(dǎo)讀:本文已添加在 晨曦微服務(wù)之旅 ,現(xiàn)在自己在嘗試微服務(wù)架構(gòu),一邊學(xué)邊做項(xiàng)目快速的進(jìn)入狀態(tài)。當(dāng)然在學(xué)習(xí)的過程中會(huì)將自己學(xué)到的知識(shí)進(jìn)行分享。
一、為什么不用HttpClient
1.HttPClient使用完之后不會(huì)立即關(guān)閉開啟網(wǎng)絡(luò)連接時(shí)會(huì)占用底層socket資源,但在HttpClient調(diào)用其本身的Dispose方法時(shí),并不能立刻釋放該資源
2.如果頻繁的使用HttpClient,頻繁的打開鏈接,關(guān)閉鏈接消耗就會(huì)很大。
二、解決方案
1.我們可以延長HttpClient的生命周期,比如對(duì)其建一個(gè)靜態(tài)的對(duì)象
private static HttpClient Client = new HttpClient();
2.或者使用單例模式,至于你使用哪一種單例模式就看你自己了,這里就不細(xì)將了。因?yàn)檫@樣感覺起來不是很舒服
三、HttpClientFactory
1.在.NET Core 2.1版本之后引入的 HttpClientFactory解決了HttpClient的所有痛點(diǎn)。有了 HttpClientFactory,我們不需要關(guān)心如何創(chuàng)建HttpClient,又如何釋放它。通過它可以創(chuàng)建具有特定業(yè)務(wù)的HttpClient,而且可以很友好的和 DI 容器結(jié)合使用,更為靈活。
2.HttpClientFactory 創(chuàng)建的HttpClient,也即是HttpClientHandler,只是這些個(gè)HttpClient被放到了“池子”中,工廠每次在create的時(shí)候會(huì)自動(dòng)判斷是新建還是復(fù)用。(默認(rèn)生命周期為2min,默認(rèn)的生命周期可以修改)
//修改默認(rèn)的生命周期 services.AddHttpClient() .SetHandlerLifetime(TimeSpan.FromMinutes(5));
四、HttpClientFactory的使用
一、第一種使用方式
在Startup.cs中進(jìn)行注冊(cè)
//注冊(cè)http請(qǐng)求服務(wù) services.AddHttpClient();
2.Httphelper請(qǐng)求輔助類中使用
/// <summary>
/// 注入http請(qǐng)求
/// </summary>
private readonly IHttpClientFactory httpClientFactory;
public HttpHelp(IHttpClientFactory _httpClientFactory)
{
httpClientFactory = _httpClientFactory;
}
// <summary>
// Get請(qǐng)求數(shù)據(jù)
// <para>最終以u(píng)rl參數(shù)的方式提交</para>
// </summary>
// <param name="parameters">參數(shù)字典,可為空</param>
// <param name="requestUri">例如/api/Files/UploadFile</param>
// <returns></returns>
public async Task<string> Get(Dictionary<string, string> parameters, string requestUri, string token)
{
//從工廠獲取請(qǐng)求對(duì)象
var client = httpClientFactory.CreateClient();
//添加請(qǐng)求頭
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.然后我們?cè)赟tartup.cs對(duì)相對(duì)的類進(jìn)行注冊(cè)就可以了使用了。
二、使用命名客戶端
1.在Startup.cs中進(jìn)行注冊(cè), 這個(gè)注冊(cè)可以存在多個(gè) 。以創(chuàng)建名字區(qū)分
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請(qǐng)求
/// </summary>
private readonly IHttpClientFactory httpClientFactory;
public HttpHelp(IHttpClientFactory _httpClientFactory)
{
httpClientFactory = _httpClientFactory;
}
// <summary>
// Get請(qǐng)求數(shù)據(jù)
// <para>最終以u(píng)rl參數(shù)的方式提交</para>
// </summary>
// <param name="parameters">參數(shù)字典,可為空</param>
// <param name="requestUri">例如/api/Files/UploadFile</param>
// <returns></returns>
public async Task<string> Get(Dictionary<string, string> parameters, string requestUri, string token)
{
//從工廠獲取請(qǐng)求對(duì)象 聲明自己創(chuàng)建哪一個(gè)httpClient客戶端
var client = httpClientFactory.CreateClient("github");
//添加請(qǐng)求頭
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.創(chuàng)建一個(gè)類
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;
}
//這個(gè)下面就是編寫自己方法,進(jìn)行調(diào)用
}
2.在Startup.cs中進(jìn)行注冊(cè), 這個(gè)注冊(cè)可以存在多個(gè)。
services.AddHttpClient<classHttp>(); //注冊(cè)之后,使用依賴注入的方式進(jìn)行注入,進(jìn)行使用。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Visual Studio 2013如何使XML文件轉(zhuǎn)換成類
Visual Studio 2013如何使XML文件轉(zhuǎn)換成類?這篇文章主要介紹了Visual Studio2013輕松將你的XML文件轉(zhuǎn)換成類的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Repeater的FooterTemplate中控件內(nèi)容設(shè)置方法
Repeater的FooterTemplate中控件內(nèi)容設(shè)置方法,需要的朋友可以參考下。2009-12-12
ASP.NET 運(yùn)行時(shí)錯(cuò)誤: 沒有為擴(kuò)展名“.asax”注冊(cè)的生成提供程序修正版
ASP.NET 運(yùn)行時(shí)錯(cuò)誤: 沒有為擴(kuò)展名“.asax”注冊(cè)的生成提供程序??梢栽?machine.config 或 web.config 中的 <compilation><buildProviders> 節(jié)注冊(cè)一個(gè)。2009-01-01
asp.net中javascript的引用(直接引入和間接引入)
Asp.net 中引入Javascript的方法有很多,個(gè)人認(rèn)為可以分為直接引入,和間接引入,下面是兩種具體的引用方法,感興趣的朋友可以參考下哈2013-06-06
Entity?Framework?Core基于數(shù)據(jù)模型創(chuàng)建數(shù)據(jù)庫
這篇文章介紹了Entity?Framework?Core基于數(shù)據(jù)模型創(chuàng)建數(shù)據(jù)庫的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
asp.net 編譯器錯(cuò)誤信息: CS0006: 未能找到元數(shù)據(jù)文件 該死的.NET
今天公司新上一臺(tái)志強(qiáng)虛擬主機(jī) 所有配置都好了 給客戶調(diào)整.net 出現(xiàn)了報(bào)錯(cuò)2009-06-06
.NET Core基于Generic Host實(shí)現(xiàn)后臺(tái)任務(wù)方法教程
這篇文章主要給大家介紹了關(guān)于.NET Core基于Generic Host實(shí)現(xiàn)后臺(tái)任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
.NET Core如何進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)的實(shí)現(xiàn)
這篇文章主要介紹了.NET Core如何進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

