您现在的位置是:网站首页> 编程资料编程资料
如何在ASP.NET Core中使用HttpClientFactory_实用技巧_
2023-05-24
256人已围观
简介 如何在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(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 logger, IHttpClientFactory httpClientFactory) { this.httpClientFactory = httpClientFactory; } [HttpGet] public async Task 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的详细内容,更多关于ASP.NET Core使用HttpClientFactory的资料请关注其它相关文章!
相关内容
- .net 预处理指令符的使用详解_实用技巧_
- .NET AppSettings与ConnectionStrings使用案例详解_实用技巧_
- 两种获取connectionString的方式案例详解_实用技巧_
- 详解ASP.NET MVC的整个生命周期_实用技巧_
- C#中efcore-ShardingCore呈现“完美”分表_实用技巧_
- Asp.net Core 如何设置黑白名单(路由限制)_实用技巧_
- 详解.NET数据库连接池_实用技巧_
- Quartz.NET的具体使用_实用技巧_
- .NET5控制台程序使用EF连接MYSQL数据库的方法_实用技巧_
- .NET中创建对象的几种方式和对比_实用技巧_
