如何在.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>(); //注冊之后,使用依賴注入的方式進行注入,進行使用。
關于如何在.net Core中使用IHttpClientFactory請求問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。