您好,登錄后才能下訂單哦!
如何在.net Core中使用IHttpClientFactory請求?針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
一、為什么不用HttpClient
1.HttPClient使用完之后不會(huì)立即關(guān)閉開啟網(wǎng)絡(luò)連接時(shí)會(huì)占用底層socket資源,但在HttpClient調(diào)用其本身的Dispose方法時(shí),并不能立刻釋放該資源
2.如果頻繁的使用HttpClient,頻繁的打開鏈接,關(guān)閉鏈接消耗就會(huì)很大。
二、解決方案
1.我們可以延長HttpClient的生命周期,比如對其建一個(gè)靜態(tài)的對象
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)行注冊
//注冊http請求服務(wù) services.AddHttpClient();
2.Httphelper請求輔助類中使用
/// <summary> /// 注入http請求 /// </summary> private readonly IHttpClientFactory httpClientFactory; public HttpHelp(IHttpClientFactory _httpClientFactory) { httpClientFactory = _httpClientFactory; } // <summary> // Get請求數(shù)據(jù) // <para>最終以url參數(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) { //從工廠獲取請求對象 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對相對的類進(jìn)行注冊就可以了使用了。
二、使用命名客戶端
1.在Startup.cs中進(jìn)行注冊, 這個(gè)注冊可以存在多個(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請求 /// </summary> private readonly IHttpClientFactory httpClientFactory; public HttpHelp(IHttpClientFactory _httpClientFactory) { httpClientFactory = _httpClientFactory; } // <summary> // Get請求數(shù)據(jù) // <para>最終以url參數(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) { //從工廠獲取請求對象 聲明自己創(chuàng)建哪一個(gè)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.創(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)行注冊, 這個(gè)注冊可以存在多個(gè)。
services.AddHttpClient<classHttp>(); //注冊之后,使用依賴注入的方式進(jìn)行注入,進(jìn)行使用。
關(guān)于如何在.net Core中使用IHttpClientFactory請求問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。