欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.net Core 使用IHttpClientFactory请求实现

程序员文章站 2022-06-17 21:45:54
     导读:本文已添加在 晨曦微服务之旅 ,现在自己在尝试微服务架构,一边学边做项目快速的进入状态。当然在学习的过程中会将自己学到...

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

一、为什么不用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的使用

一、第一种使用方式

在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>();
//注册之后,使用依赖注入的方式进行注入,进行使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。