導讀:本文已添加在晨曦微服務之旅,如今本身在嘗試微服務架構,一邊學邊作項目快速的進入狀態。固然在學習的過程當中會將本身學到的知識進行分享。
git
1、爲何不用HttpClientgithub
1.HttPClient使用完以後不會當即關閉開啓網絡鏈接時會佔用底層socket資源,但在HttpClient調用其自己的Dispose方法時,並不能馬上釋放該資源json
2.若是頻繁的使用HttpClient,頻繁的打開連接,關閉連接消耗就會很大。api
2、解決方案網絡
1.咱們能夠延長HttpClient的生命週期,好比對其建一個靜態的對象架構
private static HttpClient Client = new HttpClient();
2.或者使用單例模式,至於你使用哪種單例模式就看你本身了,這裏就不細將了。由於這樣感受起來不是很舒服app
3、HttpClientFactorysocket
1.在.NET Core 2.1版本以後引入的 HttpClientFactory解決了HttpClient的全部痛點。有了 HttpClientFactory,咱們不須要關心如何建立HttpClient,又如何釋放它。經過它能夠建立具備特定業務的HttpClient,並且能夠很友好的和 DI 容器結合使用,更爲靈活。async
//修改默認的生命週期
services.AddHttpClient() .SetHandlerLifetime(TimeSpan.FromMinutes(5));
4、HttpClientFactory的使用 微服務
1、第一種使用方式
//註冊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對相對的類進行註冊就能夠了使用了。
2、使用命名客戶端
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; }
3、類型化客戶端
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>();//註冊以後,使用依賴注入的方式進行注入,進行使用。