zoukankan      html  css  js  c++  java
  • 【转载】.net Core 使用IHttpClientFactory请求

    转载地址:https://www.cnblogs.com/chenxi001/p/12203731.html

    一、为什么不用HttpClient

            1.HttPClient使用完之后不会立即关闭开启网络连接时会占用底层socket资源,但在HttpClient调用其本身的Dispose方法时,并不能立刻释放该资源

             2.如果频繁的使用HttpClient,频繁的打开链接,关闭链接消耗就会很大。

    二、解决方案

            1.我们可以延长HttpClient的生命周期,比如对其建一个静态的对象

    private static HttpClient Client = new HttpClient();

              2.或者使用单例模式,至于你使用哪一种单例模式就看你自己了,这里就不细将了。因为这样感觉起来不是很舒服

    三、HttpClientFactory

           1.在.NET Core 2.1版本之后引入的 HttpClientFactory解决了HttpClient的所有痛点。有了 HttpClientFactory,我们不需要关心如何创建HttpClient,又如何释放它。通过它可以创建具有特定业务的HttpClient,而且可以很友好的和 DI 容器结合使用,更为灵活。

        2.HttpClientFactory 创建的HttpClient,也即是HttpClientHandler,只是这些个HttpClient被放到了“池子”中,工厂每次在create的时候会自动判断是新建还是复用。(默认生命周期为2min,默认的生命周期可以修改)
       //修改默认的生命周期
    services.AddHttpClient() .SetHandlerLifetime(TimeSpan.FromMinutes(5));

    四、HttpClientFactory的使用 

        一、第一种使用方式

    1. 在Startup.cs中进行注册
                  //注册http请求服务
                  services.AddHttpClient();

             2.Httphelper请求辅助类中使用

    复制代码
    /// <summary>
            /// 注入http请求
            /// </summary>
            private readonly IHttpClientFactory httpClientFactory;
            public HttpHelp(IHttpClientFactory _httpClientFactory)
            {
                httpClientFactory = _httpClientFactory;
            }
    
            // <summary>
            // Get请求数据
            // <para>最终以url参数的方式提交</para>
            // </summary>
            // <param name="parameters">参数字典,可为空</param>
            // <param name="requestUri">例如/api/Files/UploadFile</param>
            // <returns></returns>
            public async Task<string> Get(Dictionary<string, string> parameters, string requestUri, string token)
            {
                //从工厂获取请求对象
                var client = httpClientFactory.CreateClient();
                //添加请求头
                if (!string.IsNullOrWhiteSpace(token))
                {
                    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
                }
                client.DefaultRequestHeaders.Add("Content-Type", "application/json; charset=utf-8");
                //拼接地址
                if (parameters != null)
                {
                    var strParam = string.Join("&", parameters.Select(o => o.Key + "=" + o.Value));
                    requestUri = string.Concat(requestUri, '?', strParam);
                }
                client.BaseAddress = new Uri(requestUri);
                return client.GetStringAsync(requestUri).Result;
            }
    复制代码

                 3.然后我们在Startup.cs对相对的类进行注册就可以了使用了。

          二、使用命名客户端

         1.在Startup.cs中进行注册,这个注册可以存在多个。以创建名字区分

    复制代码
    services.AddHttpClient("github", c =>
    {
        c.BaseAddress = new Uri("https://xxxxxxx.com/");
        // Github API versioning
        c.DefaultRequestHeaders.Add("Content-Type", "application/json; charset=utf-8");
        // Github requires a user-agent
        c.DefaultRequestHeaders.Add("Authorization", "asfasfasdsgdsfsdfsdafasfas");
    });
    复制代码

               2.使用方式和上面的一样只要

    复制代码
    /// <summary>
            /// 注入http请求
            /// </summary>
            private readonly IHttpClientFactory httpClientFactory;
            public HttpHelp(IHttpClientFactory _httpClientFactory)
            {
                httpClientFactory = _httpClientFactory;
            }
    
            // <summary>
            // Get请求数据
            // <para>最终以url参数的方式提交</para>
            // </summary>
            // <param name="parameters">参数字典,可为空</param>
            // <param name="requestUri">例如/api/Files/UploadFile</param>
            // <returns></returns>
            public async Task<string> Get(Dictionary<string, string> parameters, string requestUri, string token)
            {
                //从工厂获取请求对象   声明自己创建哪一个httpClient客户端
                var client = httpClientFactory.CreateClient("github");
                //添加请求头
                if (!string.IsNullOrWhiteSpace(token))
                {
                    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
                }
                client.DefaultRequestHeaders.Add("Content-Type", "application/json; charset=utf-8");
                //拼接地址
                if (parameters != null)
                {
                    var strParam = string.Join("&", parameters.Select(o => o.Key + "=" + o.Value));
                    requestUri = string.Concat(requestUri, '?', strParam);
                }
                client.BaseAddress = new Uri(requestUri);
                return client.GetStringAsync(requestUri).Result;
            }
    复制代码

             三、类型化客户端

               1.创建一个类

    复制代码
    public class HttpClienService
    {
        public HttpClient Client { get; }
        public HttpClienService(HttpClient client)
        {
            client.BaseAddress = new Uri("https://xxxx.com/");
            // GitHub API versioning
            client.DefaultRequestHeaders.Add("Authorization",
                "xxxxxxxxxxxx");
            // GitHub requires a user-agent
            client.DefaultRequestHeaders.Add("Content-Type",
                "application/json; charset=utf-8");
            Client = client;
        }

    //这个下面就是编写自己方法,进行调用 }
    复制代码

                 2.在Startup.cs中进行注册,这个注册可以存在多个。

    services.AddHttpClient<classHttp>();
    //注册之后,使用依赖注入的方式进行注入,进行使用。
  • 相关阅读:
    VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用(简单明了)
    内存泄露检测工具(25款)
    谈VC++对象模型
    函数调用堆栈分析
    一个跨平台的 C++ 内存泄漏检测器
    网站架构资料收集整理
    分布式缓存系统memcached简介与实践
    反向代理(Reverse Proxy)
    squid和varnish的小结
    ajax简单后台交互
  • 原文地址:https://www.cnblogs.com/zhuyuchao/p/12212750.html
Copyright © 2011-2022 走看看