zoukankan      html  css  js  c++  java
  • ASP.NET Core-通过HttpClientFactory使用HttpClient

    概述:

    在.NET Framwork中使用HttpClient直接这样使用 using(var client = new HttpClient()){} ,高并发时频繁创建socket,连接来不及释放,socket被耗尽,就会出现问题。HttpClient 实现了 IDispose 接口,但当你 Dispose 它时,它不会立即关闭所使用的 tcp 连接,而是将 tcp 连接置为 TIME_WAIT 状态,240秒(4分钟)后才真正关闭连接。对于高并发的场景,比如每秒 1000 个请求,每个请求都用到 HttpClient ,4分钟内会堆积24万个 tcp 连接,这样的连接爆棚会拖垮服务器。

    所以不用频繁创建HttpClient对象,要复用,可以用单例或静态,并且设置成长连接。但这样使用有一点问题是DNS更新会失效

    在Core中推荐使用HttpClientFactory创建HttpClient,目的也是复用HttpClient。顾名思义 HttpClientFactory 就是 HttpClient 的工厂,内部已经帮我们处理好了对 HttpClient 的管理,不需要我们人工进行对象释放,同时可命名,支持自定义请求头,支持DNS更新等等等。

     HttpClientFacotry内部存放了HttpClient的缓存,并且定时Dispose,防止DNS缓存时间过长

    HttpClientFactory使用方法:

    案例1,直接使用HttpClientFactory

    1、在startup中注册

       public void ConfigureServices(IServiceCollection services)
       {
           services.AddHttpClient("client_1",config=>  //这里指定的 name=client_1 ,可以方便我们后期服用该实例
           {
               config.BaseAddress= new Uri("http://client_1.com");
               config.DefaultRequestHeaders.Add("header_1","header_1");
           });
           services.AddHttpClient("client_2",config=>
           {
               config.BaseAddress= new Uri("http://client_2.com");
               config.DefaultRequestHeaders.Add("header_2","header_2");
           });
           services.AddHttpClient();
       }

    2、Controller中使用

    public class TestController : ControllerBase
    {
     private readonly IHttpClientFactory _httpClient;
     public TestController(IHttpClientFactory httpClient)
     {
         _httpClient = httpClient;
     }
    
     public async Task<ActionResult> Test()
     {
         var client = _httpClient.CreateClient("client_1"); //复用在 Startup 中定义的 client_1 的 httpclient
         var result = await client.GetStringAsync("/page1.html");
    
         var client2 = _httpClient.CreateClient(); //新建一个 HttpClient
         var result2 = await client.GetStringAsync("http://www.site.com/XXX.html");
    
         return null;
     }
    }

    案例2:为单个HttpClient添加DelegatingHandler,拦截请求记录日志

    public class LoggingHandler : DelegatingHandler
        {
            protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                if (request.Content != null)
                {
                    Debug.WriteLine(await request.Content.ReadAsStringAsync());
                }
                HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
                if (response.Content != null)
                {
                    Debug.WriteLine(await response.Content.ReadAsStringAsync());
                }
                return response;
            }
        }

    ConfigureServices中注册:

    services.AddHttpClient("baidu", config =>  
                {
                    config.BaseAddress = new Uri("https://www.baidu.com");
                    config.DefaultRequestHeaders.Add("header_1", "header_1");
    
                }).AddHttpMessageHandler(()=>new LoggingHandler());

    案例3:设置HttpClientHandler

                services.AddHttpClient("client1", client => { client.BaseAddress = new System.Uri("https://www.baidu.com"); })
                    .ConfigurePrimaryHttpMessageHandler(() => new System.Net.Http.HttpClientHandler()
                    {//设置HttpClientHandler,也就是InnerHandler
                        UseCookies = false
                    });

    案例4:注册全局DelegatingHandler,拦截所有httpClient请求

    实现接口IHttpMessageHandlerBuilderFilter,并注册。看下面文章

    https://blog.csdn.net/weixin_30236595/article/details/101066107

    参考:

    https://blog.zhuliang.ltd/2019/02/net-core/HttpClient-HttpClientFactory-InNetCore.html

    https://blog.csdn.net/weixin_34249367/article/details/86134102 

    未完待续...

  • 相关阅读:
    Android:TabHost导航栏
    java:StringUtil工具类
    Android进阶篇MediaPlayer
    Android:图片滚轮
    Android:EditText焦点触发布局隐藏以及显示
    Android:Spinner的使用
    ASP.NET编程模型的理解
    ASP.NET页面事件(页面生命周期)
    根据用户喜欢的爱好选择不同风格CSS(ViewState)
    ASP.NET的页面指令
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12151598.html
Copyright © 2011-2022 走看看