当前位置: 移动技术网 > IT编程>开发语言>.net > .net Core 使用IHttpClientFactory请求实现

.net Core 使用IHttpClientFactory请求实现

2020年03月09日  | 移动技术网IT编程  | 我要评论

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

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网