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

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

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

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

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

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

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

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

假設(shè)你的系統(tǒng)中安裝了Visual Studio 2019,請按照下面列出來的步驟創(chuàng)建一個新的ASP.NET Core項(xiàng)目。
1. 啟動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)目放在同一個目錄中”復(fù)選框。
7. 點(diǎn)擊Create。
8. 在“創(chuàng)建一個新的ASP.NET Core Web應(yīng)用程序“窗口中,選擇。NET Core作為運(yùn)行時,然后選擇asp.net Core作為運(yùn)行時。NET Core 3.1(或更高版本)。
9. 選擇“Web Application (Model-View-Controller)”作為項(xiàng)目模板來創(chuàng)建一個新的ASP.NET Core MVC應(yīng)用程序。
10. 確保復(fù)選框“啟用Docker支持”和“配置HTTPS”沒有選中,因?yàn)槲覀儾粫谶@里使用這些特性。
11. 確保身份驗(yàn)證設(shè)置為“無身份驗(yàn)證”,因?yàn)槲覀円膊粫褂蒙矸蒡?yàn)證。
12. 單擊Create。

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

挑戰(zhàn)HttpClient

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

IHttpClientFactory 和HttpClientFactory

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

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

重載的HttpClientFactory類的Create方法看起來像這樣:

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

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

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

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

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

可以通過如下代碼將將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

要通過使用IHttpClientFactory創(chuàng)建HttpClient,應(yīng)該調(diào)用CreateClient方法。一旦HttpClient實(shí)例可用,就可以在HomeController類的index方法中使用以下代碼來調(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)討論過了。請參考“注冊一個IHttpClientFactory實(shí)例”一節(jié),該節(jié)討論了如何注冊HttpClient實(shí)例。

如果你想使用不同配置的HttpClient實(shí)例,以下是一個不錯的選擇。下面的代碼片段說明了如何創(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í)例的自定義類,該自定義類封裝了通過HTTP協(xié)議調(diào)用所有終結(jié)點(diǎn)的邏輯。下面的代碼片段說明了如何定義自定義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);
  }
}

通過以下代碼注冊自定義的client:

services.AddHttpClient<IProductService, ProductService>();

將MessageHandler添加到命名管道中

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

你可以將HttpMessageHandler添加到請求處理管道中??梢栽赟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是一個自.net Core 2.1以來就可用的工廠類。如果你使用IHttpClientFactory來創(chuàng)建HttpClient實(shí)例,那么底層HttpClientMessagehandler實(shí)例的池化和生命周期將自動管理。IHttpClientFactory還負(fù)責(zé)處理一些常見問題,比如日志記錄。

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

相關(guān)文章

最新評論