前言
在 Asp.Net Core 1.0 时代,由于设计上的问题, HttpClient 给开发者带来了无尽的困扰,用 Asp.Net Core
开发团队的话来说就是:我们注意到,HttpClient 被很多开发人员不正确的使用。得益于 .Net Core
不断的版本快速升级;
问题来源
长期以来,.NET开发者都通过下面的方式发送http请求:
using (var httpClient = new HttpClient()){ var response = await httpClient.GetAsync(uri); //do something with response}这段代码理论上来说遵守了C#的最佳实践,HttpClient是IDisposable类型,所以我们通过using语法糖来使用HttpClient。微软官方的文档也提到:
As a rule, when you use an IDisposable object, you should declare and instantiate it in a using statement
可是,当我们试图运行下面的测试:
public async Task SendRequest() { Console.WriteLine("Starting reqeust"); for(int i = 0; i<10; i++) { using(var client = new HttpClient()) { var result = await client.GetAsync("http://"); c.DefaultRequestHeaders.Add("Accept", "application/json");});一旦注册了一个名叫“baidu"的HttpClient,你就可以通过下面的方式来建创建HttpClient:
var client = _clientFactory.CreateClient("baidu");5.集成Polly
Polly是一个用来故障处理库,它允许开发者在Http请求中添加“重试、熔断器、超时等”策略。
先添加Nuget:
Microsoft.Extensions.Http.Polly添加策略:
var timeout = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(10));services.AddHttpClient("baidu") .AddPolicyHandler(request => timeout) .AddTransientHttpErrorPolicy(p=>p.RetryAsync(3));当然还有一些高阶用法,详见Initiate HTTP requests,总之HttpClientFactory提供了一种高效实用HttpClient的方式,如果你还在自己new HttpClient,请赶快试试新的方案吧。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。