.net Core 使用IHttpClientFactory請求

        導讀:本文已添加在晨曦微服務之旅,如今本身在嘗試微服務架構,一邊學邊作項目快速的進入狀態。固然在學習的過程當中會將本身學到的知識進行分享。
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

    2.HttpClientFactory 建立的HttpClient,也便是HttpClientHandler,只是這些個HttpClient被放到了「池子」中,工廠每次在create的時候會自動判斷是新建仍是複用。(默認生命週期爲2min,默認的生命週期能夠修改)
   //修改默認的生命週期
services.AddHttpClient() .SetHandlerLifetime(TimeSpan.FromMinutes(
5));

4、HttpClientFactory的使用 微服務

    1、第一種使用方式

  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對相對的類進行註冊就能夠了使用了。

      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>();//註冊以後,使用依賴注入的方式進行注入,進行使用。
相關文章
相關標籤/搜索