.net Core 使用IHttpClientFactory请求

        导读:本文已添加在晨曦微服务之旅,现在自己在尝试微服务架构,一边学边做项目快速的进入状态。当然在学习的过程中会将自己学到的知识进行分享。

一、为什么不用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>();
//注册之后,使用依赖注入的方式进行注入,进行使用。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
.NET Core中,中间件负责处理HTTP请求和响应。中间件可以在请求到达控制器之前对请求进行操作,或在响应离开控制器之前对响应进行操作。 如果中间件无法正确读取请求参数,可能有几个原因导致这种情况。以下是一些可能的原因和解决方法: 1. 请求参数绑定问题:中间件可能无法正确绑定请求参数到控制器的操作方法参数上。可以检查控制器的操作方法参数的类型和名称是否与请求参数匹配,以确保正确绑定。 2. 请求体读取问题:如果请求中包含了请求体,中间件需要正确读取请求体才能获取请求参数。可以使用`Request.Body`对象来读取请求体,并使用适当的方法(如`StreamReader`)将其转换为字符串或JSON对象。 3. 请求头问题:某些请求参数可能包含在请求头中而不是请求体中。可以通过`Request.Headers`对象来读取请求头,并使用适当的方法(如`Get(key)`)获取特定请求头的值。 4. 中间件顺序问题:如果在中间件管道中使用了多个中间件,确保它们的顺序正确。有时,其他中间件可能已经处理了请求参数,导致当前中间件无法正确读取参数。可以尝试调整中间件的顺序,确保它在其他可能影响请求参数的中间件之前执行。 5. 异常处理问题:如果中间件在读取请求参数时发生异常,可能会阻止其他中间件正确处理请求参数。可以通过在中间件代码中添加适当的错误处理逻辑来捕获并处理异常,以确保请求参数可以正确读取。 请根据具体情况检查以上可能的原因,并相应地调整中间件代码,以确保能正确读取请求参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值