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

詳解如何在ASP.NET Core中使用IHttpClientFactory

 更新時(shí)間:2021年02月19日 09:39:30   作者:碼農(nóng)翻譯站  
這篇文章主要介紹了詳解如何在ASP.NET Core中使用IHttpClientFactory,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

利用IHttpClientFactory可以無(wú)縫創(chuàng)建HttpClient實(shí)例,避免手動(dòng)管理它們的生命周期。

當(dāng)使用ASP.Net Core開(kāi)發(fā)應(yīng)用程序時(shí),可能經(jīng)常需要通過(guò)HttpClient調(diào)用WebAPI的方法以檢查終結(jié)點(diǎn)是否正常工作。要實(shí)現(xiàn)這一點(diǎn),通常需要實(shí)例化HttpClient并使用該實(shí)例來(lái)調(diào)用你的方法。但是直接使用HttpClient也有一些缺點(diǎn),主要與手動(dòng)管理實(shí)例的生命周期有關(guān)。

你可以使用IHttpClientFactory創(chuàng)建HttpClient來(lái)避免這些問(wèn)題。IHttpClientFactory是在.Net Core 2.1引入的,它提供了一個(gè)命名,配置和創(chuàng)建HttpClient實(shí)例的核心功能,并能自動(dòng)管理實(shí)例的池化和生命周期。

下面我們通過(guò)代碼進(jìn)一步討論HttpClient和IHttpClientFactory,以及所設(shè)計(jì)的概念。要使用提供的代碼,你需要安裝Visual Studio 2019。

在Visual Studio 2019中創(chuàng)建一個(gè)ASP.NET Core MVC項(xiàng)目

假設(shè)你的系統(tǒng)中安裝了Visual Studio 2019,請(qǐng)按照下面列出來(lái)的步驟創(chuàng)建一個(gè)新的ASP.NET Core項(xiàng)目。
1. 啟動(dòng)Visual Studio IDE。
2. 點(diǎn)擊“創(chuàng)建新項(xiàng)目”。
3. 在“創(chuàng)建新項(xiàng)目”窗口中,從模板列表中選擇ASP.NET Core Web應(yīng)用程序。
4. 單擊Next。
5. 在“配置新項(xiàng)目”窗口中,指定新項(xiàng)目的名稱和位置。
6. 可以選擇“將解決方案和項(xiàng)目放在同一個(gè)目錄中”復(fù)選框。
7. 點(diǎn)擊Create。
8. 在“創(chuàng)建一個(gè)新的ASP.NET Core Web應(yīng)用程序“窗口中,選擇。NET Core作為運(yùn)行時(shí),然后選擇asp.net Core作為運(yùn)行時(shí)。NET Core 3.1(或更高版本)。
9. 選擇“Web Application (Model-View-Controller)”作為項(xiàng)目模板來(lái)創(chuàng)建一個(gè)新的ASP.NET Core MVC應(yīng)用程序。
10. 確保復(fù)選框“啟用Docker支持”和“配置HTTPS”沒(méi)有選中,因?yàn)槲覀儾粫?huì)在這里使用這些特性。
11. 確保身份驗(yàn)證設(shè)置為“無(wú)身份驗(yàn)證”,因?yàn)槲覀円膊粫?huì)使用身份驗(yàn)證。
12. 單擊Create。

按照這些步驟將創(chuàng)建一個(gè)新的ASP.NET Core MVC應(yīng)用程序。在新項(xiàng)目中,創(chuàng)建一個(gè)新的API Controller,并使用默認(rèn)名稱保存它,即ValuesController。我們將在接下來(lái)的部分中使用這個(gè)項(xiàng)目。

挑戰(zhàn)HttpClient

盡管HttpClient沒(méi)有直接實(shí)現(xiàn)IDisposable接口,但它擴(kuò)展了System.Net.Http。HttpMessageInvoker,這個(gè)類實(shí)現(xiàn)了IDisposable。然而,當(dāng)使用HttpClient實(shí)例時(shí),你不應(yīng)該手動(dòng)操作釋放它們。盡管可以在HttpClient實(shí)例上調(diào)用Dispose方法,但不推薦這樣做。
應(yīng)該怎么做呢?一種選擇是使HttpClient靜態(tài)化,或者將HttpClient的非靜態(tài)實(shí)例包裝在自定義類中,并使其成為單例類。但是更好的替代方法是使用IHttpClientFactory來(lái)生成HttpClient的實(shí)例,然后使用該實(shí)例來(lái)調(diào)用操作方法。

IHttpClientFactory 和HttpClientFactory

IHttpClientFactory是一個(gè)由DefaultHttpClientFactory類實(shí)現(xiàn)的接口,這是一個(gè)工廠模式。DefaultHttpClientFactory實(shí)現(xiàn)了IHttpClientFactory和IHttpMessageHandlerFactory接口。IHttpClientFactory提供了ASP.NET Core對(duì)創(chuàng)建、緩存和處理HttpClient實(shí)例提供了出色的內(nèi)置支持。
請(qǐng)注意,HttpClientFactory只是一個(gè)幫助類,用于創(chuàng)建使用提供的處理程序配置的HttpClient實(shí)例。這個(gè)類有以下方法:

Create(DelegatingHandler[])
Create(HttpMessageHandler,DelegatingHandler[])
CreatePipeline(HttpMessageHandler,IEnumerable<DelegatingHandler>)

重載的HttpClientFactory類的Create方法看起來(lái)像這樣:

public static HttpClient Create(params DelegatingHandler[] handlers)
{
 return Create(new HttpClientHandler(), handlers);
}
public static HttpClient Create(HttpMessageHandler innerHandler, params DelegatingHandler[] handlers)
{
 HttpMessageHandler pipeline = CreatePipeline(innerHandler, handlers);
 return new HttpClient(pipeline);
}

引入HttpClientFactory和IHttpClientFactory是為了更好地管理HttpMessageHandler實(shí)例的生命周期。

為什么使用IHttpClientFactory?

當(dāng)你釋放HttpClient實(shí)例時(shí),連接將保持打開(kāi)狀態(tài)長(zhǎng)達(dá)4分鐘。此外,可以在任何時(shí)間點(diǎn)打開(kāi)socket的數(shù)量是有限制的——不能同時(shí)打開(kāi)太多socket。因此,當(dāng)使用太多HttpClient實(shí)例時(shí),可能會(huì)耗盡socket。
這就是IHttpClientFactory的意義所在。你可以通過(guò)利用IHttpClientFactory來(lái)創(chuàng)建用于調(diào)用HTTP API方法的HttpClient實(shí)例,以避免HttpClient所面臨的問(wèn)題。在ASP.NET Core中實(shí)現(xiàn)IHttpClientFactory的主要目標(biāo)是為了確保使用工廠模式創(chuàng)建HttpClient實(shí)例的同時(shí)避免socket耗盡。

在ASP.NET Core中注冊(cè)IHttpClientFactory實(shí)例

你可以在Startup類的ConfigureServices方法中,通過(guò)調(diào)用IServiceCollection實(shí)例上的AddHttpClient擴(kuò)展方法注冊(cè)一個(gè)IHttpClientFactory類型的實(shí)例,如下:

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews();
  services.AddHttpClient();
}

將IHttpClientFactory實(shí)例注入到控制器

可以通過(guò)如下代碼將將IHttpClientFactory實(shí)例注入到控制器:

public class HomeController : Controller
{
   private IHttpClientFactory _httpClientFactory;
   private readonly ILogger<HomeController> _logger;
   public HomeController(ILogger<HomeController> logger,
   IHttpClientFactory httpClientFactory)
   {
      _logger = logger;
      _httpClientFactory = httpClientFactory;
   }
}

在Action中調(diào)用HttpClient

要通過(guò)使用IHttpClientFactory創(chuàng)建HttpClient,應(yīng)該調(diào)用CreateClient方法。一旦HttpClient實(shí)例可用,就可以在HomeController類的index方法中使用以下代碼來(lái)調(diào)用ValuesController類的Get方法。

public async Task<IActionResult> Index()
{
  HttpClient httpClient = _httpClientFactory.CreateClient();
  httpClient.BaseAddress = new Uri("http://localhost:1810/");
  var response = await httpClient.GetAsync("/api/values");
  string str = await response.Content.ReadAsStringAsync();
  List<string> data = JsonSerializer.Deserialize<List<string>>(str);
  return View(data);
}

使用IHttpClientFactory在ASP.NET Core中創(chuàng)建和管理HttpClient實(shí)例

有幾種方法可以在應(yīng)用程序中使用IHttpClientFactory。這包括直接使用IHttpClientFactory、使用命名client和類型client。
基本的或一般的使用模式,即直接使用IHttpClientFactory—在前面的小節(jié)中已經(jīng)討論過(guò)了。請(qǐng)參考“注冊(cè)一個(gè)IHttpClientFactory實(shí)例”一節(jié),該節(jié)討論了如何注冊(cè)HttpClient實(shí)例。

如果你想使用不同配置的HttpClient實(shí)例,以下是一個(gè)不錯(cuò)的選擇。下面的代碼片段說(shuō)明了如何創(chuàng)建。

services.AddHttpClient("github", c =>
{
  c.BaseAddress = new Uri("https://api.github.com/");
  c.DefaultRequestHeaders.Add("Accept",
  "application/vnd.github.v3+json");
  c.DefaultRequestHeaders.Add("User-Agent", "This is a test user agent");
});

第二種方法是使用包裝了HttpClient實(shí)例的自定義類,該自定義類封裝了通過(guò)HTTP協(xié)議調(diào)用所有終結(jié)點(diǎn)的邏輯。下面的代碼片段說(shuō)明了如何定義自定義HttpClient類。

public class ProductService : IProductService
{
  private IHttpClientFactory _httpClientFactory;
  private readonly HttpClient _httpClient;
  private readonly string _baseUrl = "http://localhost:1810/";
  public ProductService(HttpClient httpClient)
  {
    _httpClient = httpClient;
  }
  public async Task<Catalog> GetAllProducts()
  {
    _httpClient = _httpClientFactory.CreateClient();
    _httpClient.BaseAddress = new Uri(_baseUrl);
    var uri = "/api/products";
    var result = await _httpClient.GetStringAsync(uri);
    return JsonConvert.DeserializeObject<Product>(result);
  }
}

通過(guò)以下代碼注冊(cè)自定義的client:

services.AddHttpClient<IProductService, ProductService>();

將MessageHandler添加到命名管道中

MessageHandler是擴(kuò)展自HttpMessageHandler類,它可以接受HTTP請(qǐng)求并返回HTTP響應(yīng)。如果你想構(gòu)建自己的MessageHandler,你應(yīng)該創(chuàng)建一個(gè)繼承DelegatingHandler的類。

你可以將HttpMessageHandler添加到請(qǐng)求處理管道中??梢栽赟tartup類的ConfigureServices方法中使用以下代碼將HttpMessageHandler添加到管道中。

public void ConfigureServices(IServiceCollection services)
{
  services.AddHttpClient("github", c =>
  {
    c.BaseAddress = new Uri("https://api.github.com/");
  })
  .AddHttpMessageHandler<DemoHandler>();
  services.AddTransient<DemoHandler>();
}

IHttpClientFactory是一個(gè)自.net Core 2.1以來(lái)就可用的工廠類。如果你使用IHttpClientFactory來(lái)創(chuàng)建HttpClient實(shí)例,那么底層HttpClientMessagehandler實(shí)例的池化和生命周期將自動(dòng)管理。IHttpClientFactory還負(fù)責(zé)處理一些常見(jiàn)問(wèn)題,比如日志記錄。

到此這篇關(guān)于詳解如何在ASP.NET Core中使用IHttpClientFactory的文章就介紹到這了,更多相關(guān)ASP.NET Core使用IHttpClientFactory內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論