欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.net Core 使用IHttpClientFactory請(qǐng)求實(shí)現(xiàn)

 更新時(shí)間:2020年01月17日 08:20:23   作者:晨曦001  
這篇文章主要介紹了.net Core 使用IHttpClientFactory請(qǐng)求實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

     導(dǎo)讀:本文已添加在 晨曦微服務(wù)之旅 ,現(xiàn)在自己在嘗試微服務(wù)架構(gòu),一邊學(xué)邊做項(xiàng)目快速的進(jìn)入狀態(tài)。當(dāng)然在學(xué)習(xí)的過(guò)程中會(huì)將自己學(xué)到的知識(shí)進(jìn)行分享。

一、為什么不用HttpClient

        1.HttPClient使用完之后不會(huì)立即關(guān)閉開(kāi)啟網(wǎng)絡(luò)連接時(shí)會(huì)占用底層socket資源,但在HttpClient調(diào)用其本身的Dispose方法時(shí),并不能立刻釋放該資源

2.如果頻繁的使用HttpClient,頻繁的打開(kāi)鏈接,關(guān)閉鏈接消耗就會(huì)很大。

二、解決方案

        1.我們可以延長(zhǎng)HttpClient的生命周期,比如對(duì)其建一個(gè)靜態(tài)的對(duì)象

private static HttpClient Client = new HttpClient();

2.或者使用單例模式,至于你使用哪一種單例模式就看你自己了,這里就不細(xì)將了。因?yàn)檫@樣感覺(jué)起來(lái)不是很舒服

三、HttpClientFactory

        1.在.NET Core 2.1版本之后引入的 HttpClientFactory解決了HttpClient的所有痛點(diǎn)。有了 HttpClientFactory,我們不需要關(guān)心如何創(chuàng)建HttpClient,又如何釋放它。通過(guò)它可以創(chuàng)建具有特定業(yè)務(wù)的HttpClient,而且可以很友好的和 DI 容器結(jié)合使用,更為靈活。

2.HttpClientFactory 創(chuàng)建的HttpClient,也即是HttpClientHandler,只是這些個(gè)HttpClient被放到了“池子”中,工廠(chǎng)每次在create的時(shí)候會(huì)自動(dòng)判斷是新建還是復(fù)用。(默認(rèn)生命周期為2min,默認(rèn)的生命周期可以修改)

  //修改默認(rèn)的生命周期
  services.AddHttpClient()
 .SetHandlerLifetime(TimeSpan.FromMinutes(5));

四、HttpClientFactory的使用

一、第一種使用方式

在Startup.cs中進(jìn)行注冊(cè)

 //注冊(cè)http請(qǐng)求服務(wù)
 services.AddHttpClient();

2.Httphelper請(qǐng)求輔助類(lèi)中使用

/// <summary>
    /// 注入http請(qǐng)求
    /// </summary>
    private readonly IHttpClientFactory httpClientFactory;
    public HttpHelp(IHttpClientFactory _httpClientFactory)
    {
      httpClientFactory = _httpClientFactory;
    }

    // <summary>
    // Get請(qǐng)求數(shù)據(jù)
    // <para>最終以u(píng)rl參數(shù)的方式提交</para>
    // </summary>
    // <param name="parameters">參數(shù)字典,可為空</param>
    // <param name="requestUri">例如/api/Files/UploadFile</param>
    // <returns></returns>
    public async Task<string> Get(Dictionary<string, string> parameters, string requestUri, string token)
    {
      //從工廠(chǎng)獲取請(qǐng)求對(duì)象
      var client = httpClientFactory.CreateClient();
      //添加請(qǐng)求頭
      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.然后我們?cè)赟tartup.cs對(duì)相對(duì)的類(lèi)進(jìn)行注冊(cè)就可以了使用了。

二、使用命名客戶(hù)端

1.在Startup.cs中進(jìn)行注冊(cè), 這個(gè)注冊(cè)可以存在多個(gè) 。以創(chuàng)建名字區(qū)分

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請(qǐng)求
    /// </summary>
    private readonly IHttpClientFactory httpClientFactory;
    public HttpHelp(IHttpClientFactory _httpClientFactory)
    {
      httpClientFactory = _httpClientFactory;
    }

    // <summary>
    // Get請(qǐng)求數(shù)據(jù)
    // <para>最終以u(píng)rl參數(shù)的方式提交</para>
    // </summary>
    // <param name="parameters">參數(shù)字典,可為空</param>
    // <param name="requestUri">例如/api/Files/UploadFile</param>
    // <returns></returns>
    public async Task<string> Get(Dictionary<string, string> parameters, string requestUri, string token)
    {
      //從工廠(chǎng)獲取請(qǐng)求對(duì)象  聲明自己創(chuàng)建哪一個(gè)httpClient客戶(hù)端
      var client = httpClientFactory.CreateClient("github");
      //添加請(qǐng)求頭
      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;
    }

三、類(lèi)型化客戶(hù)端

1.創(chuàng)建一個(gè)類(lèi)

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;
  }

  //這個(gè)下面就是編寫(xiě)自己方法,進(jìn)行調(diào)用
}

2.在Startup.cs中進(jìn)行注冊(cè), 這個(gè)注冊(cè)可以存在多個(gè)。

services.AddHttpClient<classHttp>();
//注冊(cè)之后,使用依賴(lài)注入的方式進(jìn)行注入,進(jìn)行使用。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論