如何在ASP.NET Core中使用HttpClientFactory
ASP.Net Core 是一個開源的,跨平臺的,輕量級模塊化框架,可用它來構建高性能的Web程序,這篇文章我們將會討論如何在 ASP.Net Core 中使用 HttpClientFactory。
為什么要使用 HttpClientFactory
可以用 HttpClientFactory 來集中化管理 HttpClient,工廠提供了對 HttpClient 的創(chuàng)建,配置和調度,值得一提的是:HttpClient 一直都是 Http 請求業(yè)務方面的一等公民。
HttpClient 雖好,但它有一些缺點:
- 創(chuàng)建太多的 HttpClient 是一種低效的行為,因為當一個新客戶端連接到遠程 Server 時,你的應用程序還需要承擔著重連遠程 Server 的開銷。
- 如果每一個 request 都創(chuàng)建一個 HttpClient,當應用程序負載過大, Socket 必將耗盡,比如默認情況下 HttpClient 會維持至少4分鐘的 Connection 連接。
所以推薦的做法是創(chuàng)建一個可供復用的共享式 HttpClient 實例,如果你要打破沙鍋問到低的話,即使是創(chuàng)建共享式的 HttpClient 也會有很多問題,比如它會無視 DNS 緩存生效,那怎么辦呢?可以用 .NET Core 2.1 引入的 HttpClientFactory 來解決此問題。。。用它來統(tǒng)一化的高效管理 HttpClient。
使用 HttpClientFactory
HttpClientFactory 有兩種使用方式。
- NamedClient
- TypedClient
所謂的 NamedClient 就是注冊帶有標記的 HttpClient 到 HttpClientFactory 工廠中,下面的代碼展示了一個名為 IDGCustomApi
的 HttpClient 的工廠注冊。
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddHttpClient("IDGCustomApi", client => { client.BaseAddress = new Uri("https://localhost:6045/"); client.DefaultRequestHeaders.Add("Accept", "application/json"); client.DefaultRequestHeaders.Add("User-Agent", "IDG"); }); services.AddControllers(); }
所謂的 TypedClient 就是注冊一個你自定義的 HttpClient,我想你肯定有點懵逼了,沒關系,我現(xiàn)在就來自定義 HttpClient, 然后通過 AddHttpClient() 注冊到容器中。
public class CustomHttpClient { public HttpClient Client { get; } public CustomHttpClient(HttpClient client) { Client = client; } } public class Startup { // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddHttpClient<CustomHttpClient>(client => client.BaseAddress = new Uri("https://localhost:6045/")); services.AddControllers(); } }
注入 Controller
為了能夠在 Controller 中使用,可以將 IHttpClientFactory 通過構造函數(shù)方式進行注入,參考如下代碼:
[ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private IHttpClientFactory httpClientFactory; public WeatherForecastController(ILogger<WeatherForecastController> logger, IHttpClientFactory httpClientFactory) { this.httpClientFactory = httpClientFactory; } [HttpGet] public async Task<string> Get() { var httpClient = httpClientFactory.CreateClient("IDGCustomApi"); string html = await httpClient.GetStringAsync("http://bing.com"); return html; } }
從 IHttpClientFactory 的默認實現(xiàn) DefaultHttpClientFactory 的源碼也可以看出,httpClient 所關聯(lián)的 HttpMessageHandler 和 Options 都被工廠跟蹤和管控。
internal class DefaultHttpClientFactory : IHttpClientFactory, IHttpMessageHandlerFactory { public HttpClient CreateClient(string name) { if (name == null) { throw new ArgumentNullException("name"); } HttpMessageHandler handler = CreateHandler(name); HttpClient httpClient = new HttpClient(handler, disposeHandler: false); HttpClientFactoryOptions httpClientFactoryOptions = _optionsMonitor.Get(name); for (int i = 0; i < httpClientFactoryOptions.HttpClientActions.Count; i++) { httpClientFactoryOptions.HttpClientActions[i](httpClient); } return httpClient; } public HttpMessageHandler CreateHandler(string name) { if (name == null) { throw new ArgumentNullException("name"); } ActiveHandlerTrackingEntry value = _activeHandlers.GetOrAdd(name, _entryFactory).Value; StartHandlerEntryTimer(value); return value.Handler; } }
譯文鏈接:https://www.infoworld.com/article/3276007/how-to-work-with-httpclientfactory-in-aspnet-core.html
以上就是如何在ASP.NET Core中使用HttpClientFactory的詳細內容,更多關于ASP.NET Core使用HttpClientFactory的資料請關注腳本之家其它相關文章!
相關文章
代碼實現(xiàn)打印功能(asp.net+javascript)
頁面實現(xiàn)打印的效果代碼,分為服務器端和客戶端單個即可,客戶端的比較不錯,本站也是類似的方法。2009-05-05如何在ASP.NET Core中使用HttpClientFactory
這篇文章主要介紹了如何在ASP.NET Core中使用HttpClientFactory,幫助大家更好的理解和學習使用.net技術,感興趣的朋友可以了解下2021-04-04解決asp.net Sharepoint無法連接發(fā)布自定義字符串處理程序,不能進行輸出緩存處理的方法
解決Sharepoint無法連接發(fā)布自定義字符串處理程序,不能進行輸出緩存處理的方法2010-03-03網(wǎng)頁(aspx)與用戶控件(ascx)交互邏輯處理實現(xiàn)
為了以后好維護,把幾個頁面(ASPX)相同的部分抽取放在一個用戶控件(ASCX)上,現(xiàn)在把邏輯分享下,感興趣的各位可以參考下哈2013-03-03.NET一行代碼實現(xiàn)GC調優(yōu),讓程序不再占用內存
這篇文章主要介紹了NET一行代碼實現(xiàn)GC調優(yōu),讓程序不再占用內存的相關資料,需要的朋友可以參考下2022-11-11IP地址與整數(shù)之間的轉換實現(xiàn)代碼(asp.net)
把這個整數(shù)轉換成一個32位二進制數(shù)。從左到右,每8位進行一下分割,得到4段8位的二進制數(shù),把這些二進制數(shù)轉換成整數(shù)然后加上”。”就是這個ip地址了2012-09-09asp.net(vb)實現(xiàn)金額轉換成大寫的函數(shù)
asp.net(vb)實現(xiàn)金額轉換成大寫的函數(shù)代碼,需要的朋友可以參考下。2011-10-10