1. 程式人生 > 程式設計 >.net Core 使用IHttpClientFactory請求實現

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

一、第一種使用方式

在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">引數字典,string token)
    {
      //從工廠獲取請求物件  宣告自己建立哪一個httpClient客戶端
      var client = httpClientFactory.CreateClient("github");
      //新增請求頭
      if (!string.IsNullOrWhiteSpace(token))
      {
        client.DefaultRequestHeaders.Add("Authorization",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>();
//註冊之後,使用依賴注入的方式進行注入,進行使用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。