.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的使用 

    一、第一種使用方式

  1. 在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>();
//注冊之后,使用依賴注入的方式進行注入,進行使用。


免責聲明!

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



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