如何在ASP.NET Core中使用HttpClientFactory

发布时间:2022-04-16 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了如何在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的详细内容,更多关于ASP.NET Core使用HttpClientFactory的资料请关注脚本宝典其它相关文章!

脚本宝典总结

以上是脚本宝典为你收集整理的如何在ASP.NET Core中使用HttpClientFactory全部内容,希望文章能够帮你解决如何在ASP.NET Core中使用HttpClientFactory所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。