日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

如何在 ASP.NET Core 中使用 HttpClientFactory ?

發布時間:2023/12/4 asp.net 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在 ASP.NET Core 中使用 HttpClientFactory ? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ASP.Net Core 是一個開源的,跨平臺的,輕量級模塊化框架,可用它來構建高性能的Web程序,這篇文章我們將會討論如何在 ASP.Net Core 中使用 HttpClientFactory。

為什么要使用 HttpClientFactory

可以用 HttpClientFactory 來集中化管理 HttpClient,工廠提供了對 HttpClient 的創建,配置和調度,值得一提的是:HttpClient 一直都是 Http 請求業務方面的一等公民。

HttpClient 雖好,但它有一些缺點:

  • 創建太多的 HttpClient 是一種低效的行為,因為當一個新客戶端連接到遠程 Server 時,你的應用程序還需要承擔著重連遠程 Server 的開銷。

  • 如果每一個 request 都創建一個 HttpClient,當應用程序負載過大, Socket 必將耗盡,比如默認情況下 HttpClient 會維持至少4分鐘的 Connection 連接。

所以推薦的做法是創建一個可供復用的共享式 HttpClient 實例,如果你要打破沙鍋問到低的話,即使是創建共享式的 HttpClient 也會有很多問題,比如它會無視 DNS 緩存生效,那怎么辦呢?可以用 .NET Core 2.1 引入的 HttpClientFactory 來解決此問題。。。用它來統一化的高效管理 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,我想你肯定有點懵逼了,沒關系,我現在就來自定義 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 通過構造函數方式進行注入,參考如下代碼:

[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 的默認實現 DefaultHttpClientFactory 的源碼也可以看出,httpClient 所關聯的 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 ?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。