如何在ASP.NET Core中使用HttpClientFactory
ASP.Net Core 是一個(gè)開源的,跨平臺(tái)的,輕量級(jí)模塊化框架,可用它來(lái)構(gòu)建高性能的Web程序,這篇文章我們將會(huì)討論如何在 ASP.Net Core 中使用 HttpClientFactory。
為什么要使用 HttpClientFactory
可以用 HttpClientFactory 來(lái)集中化管理 HttpClient,工廠提供了對(duì) HttpClient 的創(chuàng)建,配置和調(diào)度,值得一提的是:HttpClient 一直都是 Http 請(qǐng)求業(yè)務(wù)方面的一等公民。
HttpClient 雖好,但它有一些缺點(diǎn):
- 創(chuàng)建太多的 HttpClient 是一種低效的行為,因?yàn)楫?dāng)一個(gè)新客戶端連接到遠(yuǎn)程 Server 時(shí),你的應(yīng)用程序還需要承擔(dān)著重連遠(yuǎn)程 Server 的開銷。
- 如果每一個(gè) request 都創(chuàng)建一個(gè) HttpClient,當(dāng)應(yīng)用程序負(fù)載過(guò)大, Socket 必將耗盡,比如默認(rèn)情況下 HttpClient 會(huì)維持至少4分鐘的 Connection 連接。
所以推薦的做法是創(chuàng)建一個(gè)可供復(fù)用的共享式 HttpClient 實(shí)例,如果你要打破沙鍋問(wèn)到低的話,即使是創(chuàng)建共享式的 HttpClient 也會(huì)有很多問(wèn)題,比如它會(huì)無(wú)視 DNS 緩存生效,那怎么辦呢?可以用 .NET Core 2.1 引入的 HttpClientFactory 來(lái)解決此問(wèn)題。。。用它來(lái)統(tǒng)一化的高效管理 HttpClient。
使用 HttpClientFactory
HttpClientFactory 有兩種使用方式。
- NamedClient
- TypedClient
所謂的 NamedClient 就是注冊(cè)帶有標(biāo)記的 HttpClient 到 HttpClientFactory 工廠中,下面的代碼展示了一個(gè)名為 IDGCustomApi
的 HttpClient 的工廠注冊(cè)。
// 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 就是注冊(cè)一個(gè)你自定義的 HttpClient,我想你肯定有點(diǎn)懵逼了,沒(méi)關(guān)系,我現(xiàn)在就來(lái)自定義 HttpClient, 然后通過(guò) AddHttpClient() 注冊(cè)到容器中。
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 通過(guò)構(gòu)造函數(shù)方式進(jìn)行注入,參考如下代碼:
[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 的默認(rèn)實(shí)現(xiàn) DefaultHttpClientFactory 的源碼也可以看出,httpClient 所關(guān)聯(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的詳細(xì)內(nèi)容,更多關(guān)于ASP.NET Core使用HttpClientFactory的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
asp.net B2B網(wǎng)站對(duì)接支付寶接口
首先,網(wǎng)上購(gòu)物系統(tǒng)必須與支付寶公司簽訂合作協(xié)議,以確保從本購(gòu)物網(wǎng)站上傳到2010-06-06代碼實(shí)現(xiàn)打印功能(asp.net+javascript)
頁(yè)面實(shí)現(xiàn)打印的效果代碼,分為服務(wù)器端和客戶端單個(gè)即可,客戶端的比較不錯(cuò),本站也是類似的方法。2009-05-05如何在ASP.NET Core中使用HttpClientFactory
這篇文章主要介紹了如何在ASP.NET Core中使用HttpClientFactory,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下2021-04-04.NET8.0發(fā)布到IIS的實(shí)現(xiàn)步驟
很多學(xué)習(xí).Net的朋友初次接觸并不知道一個(gè).Net應(yīng)用怎么發(fā)布到IIS服務(wù)器中去,本文主要介紹了.NET8.0發(fā)布到IIS的實(shí)現(xiàn)步驟,感興趣的可以了解一下2024-05-05解決asp.net Sharepoint無(wú)法連接發(fā)布自定義字符串處理程序,不能進(jìn)行輸出緩存處理的方法
解決Sharepoint無(wú)法連接發(fā)布自定義字符串處理程序,不能進(jìn)行輸出緩存處理的方法2010-03-03網(wǎng)頁(yè)(aspx)與用戶控件(ascx)交互邏輯處理實(shí)現(xiàn)
為了以后好維護(hù),把幾個(gè)頁(yè)面(ASPX)相同的部分抽取放在一個(gè)用戶控件(ASCX)上,現(xiàn)在把邏輯分享下,感興趣的各位可以參考下哈2013-03-03.NET一行代碼實(shí)現(xiàn)GC調(diào)優(yōu),讓程序不再占用內(nèi)存
這篇文章主要介紹了NET一行代碼實(shí)現(xiàn)GC調(diào)優(yōu),讓程序不再占用內(nèi)存的相關(guān)資料,需要的朋友可以參考下2022-11-11asp.net高效替換大容量字符實(shí)現(xiàn)代碼
每次替換完后,在下次替換時(shí)先排除這次替換的內(nèi)容,累加本次替換的內(nèi)容。2008-08-08IP地址與整數(shù)之間的轉(zhuǎn)換實(shí)現(xiàn)代碼(asp.net)
把這個(gè)整數(shù)轉(zhuǎn)換成一個(gè)32位二進(jìn)制數(shù)。從左到右,每8位進(jìn)行一下分割,得到4段8位的二進(jìn)制數(shù),把這些二進(jìn)制數(shù)轉(zhuǎn)換成整數(shù)然后加上”。”就是這個(gè)ip地址了2012-09-09asp.net(vb)實(shí)現(xiàn)金額轉(zhuǎn)換成大寫的函數(shù)
asp.net(vb)實(shí)現(xiàn)金額轉(zhuǎn)換成大寫的函數(shù)代碼,需要的朋友可以參考下。2011-10-10