快捷的網絡請求,多用HttpClient
但是常規的寫法會一大片的TIME_OUT
比如這樣的例子
static async Task<string> TestHttpClient(string url) { using (var httpClient = new HttpClient()) { var response = await httpClient.GetAsync(url); var context = response.Content; var result = await context.ReadAsStringAsync(); return result; } }
HttpClient內部是線程安全的,所以可以改為
static async Task<string> TestHttpClient(HttpClient httpClient, string url) { var response = await httpClient.GetAsync(url); var context = response.Content; var result = await context.ReadAsStringAsync(); return result; }
但是很多場景下,這樣卻不方便~
那我們改一下
注入一個可以拿到單實例的HttpClient的接口,用這個接口就好了
public interface IHttpClientSingle { HttpClient Single { get; } } internal class HttpClientSingle : IHttpClientSingle { public HttpClient Single { get; } public HttpClientSingle() { Single = new HttpClient(); } }
在入口注入一下
services.AddSingleton<IHttpClientSingle, HttpClientSingle>();
需要HttpClient對象的地方就調用這個Single屬性就好了
到這里是不是就搞定了,聽聞.net core 2.1有個方案叫HttpClientFactory就解決這個問題呢?
它的本質是儲存了一組HttpClientHandler,HttpClient構造方法里面,有一個重載的方法第一個參數傳入,第二個參數置為False
參考地址:
代碼行號124、125行
這個是我自己研究出來之后,再對照了一下實現,發現思路是一個
HttpClientHandler這個在.net core 2.0就有,更早版本就沒追述了
到底是微軟的坑,還是錯誤的用法的鍋呢?陷入沉思
附上一組測試的代碼
static async void Test1(string url,int count) { using (var httpClientHandle = new HttpClientHandler()) { for (int i = 0; i < count; i++) { using (var httpClient = new HttpClient(httpClientHandle, false)) { var response = await httpClient.GetAsync(url); var context = response.Content; var result = await context.ReadAsStringAsync(); Console.WriteLine($"{result}"); } } } Console.WriteLine("End"); }