gpt4 book ai didi

.net Core 使用IHttpClientFactory请求实现

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章.net Core 使用IHttpClientFactory请求实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

1、为什么不用HttpClient 。

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

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

2、解决方案 。

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

?
1
private static HttpClient Client = new HttpClient();

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

3、HttpClientFactory 。

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

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

?
1
2
3
//修改默认的生命周期
  services.AddHttpClient()
.SetHandlerLifetime(TimeSpan.FromMinutes(5));

4、HttpClientFactory的使用 。

1、第一种使用方式 。

在Startup.cs中进行注册 。

?
1
2
//注册http请求服务
services.AddHttpClient();

2.Httphelper请求辅助类中使用 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/// <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对相对的类进行注册就可以了使用了.

2、使用命名客户端 。

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

?
1
2
3
4
5
6
7
8
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.使用方式和上面的一样只要 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/// <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;
     }

3、类型化客户端 。

1.创建一个类 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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中进行注册, 这个注册可以存在多个.

?
1
2
services.AddHttpClient<classHttp>();
//注册之后,使用依赖注入的方式进行注入,进行使用。

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

原文链接:https://www.cnblogs.com/chenxi001/p/12203731.html 。

最后此篇关于.net Core 使用IHttpClientFactory请求实现的文章就讲到这里了,如果你想了解更多关于.net Core 使用IHttpClientFactory请求实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com