正確的使用HttpClient


快捷的網絡請求,多用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

參考地址:

DefaultHttpClientFactory.cs

代碼行號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");
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM