当我们搜索HttpClient的最佳实践时会了解到,HttpClient实例创建时会花费大量的资源用于创建HttpClientHandler实例,而且大量创建HttpClient实例还有可能造成socket端口全部耗尽的问题,所以有些开发人员会想到利用static变量来减少HttpClient的创建。但是static的HttpClient有存在无法适应DNS信息更新的问题,因此就引出了对于使用HttpClientFactory来管理HttpClient生命周期的建议。
在.NET Framework中使用HttpClientFactory,我们需要安装Microsoft.Extensions.Http和Microsoft.Extensions.DependencyInjection两个NuGet包,前者使我们可以使用HttpClientFactory,后者则使我们可以配置(configure)HttpClientFactory。如果,您还想通过Polly来进一步配置request,则还需安装Microsoft.Extensions.Http.Polly。
本文示例如何实现并配置一个Typed HttpClient。其实现的关键在于,我们需要自定义一个会使用到HttpClient实例的接口,之后在实现该接口时,将HttpClient实例作为参数传入其构造函数中。
using System.Net.Http;
namespace ConsoleApp
{
public interface ICustomHttpClient
{
HttpClient HttpClient { get; }
}
}
using System.Net.Http;
namespace ConsoleApp
{
public class CustomHttpClient : ICustomHttpClient
{
public CustomHttpClient(HttpClient httpClient) => HttpClient = httpClient;
public HttpClient HttpClient { get; }
}
}
有了相关的自定义的HttpClient的接口和实现之后,我们就可以在Main函数中对我们所需的HttpClient进行配置并调用了。
using System.Net.Http;
namespace ConsoleApp
{
class Program
{
static async Task Main(string[] args)
{
var services = new ServiceCollection();
services.AddHttpClient()
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { UseDefaultCredentials = true });
var serviceProvider = services.BuildServiceProvider();
var httpClient = serviceProvider.GetRequiredService().HttpClient;
// your code to send http request
}
}
}
HttpClient并发处理Http请求的数量取决于其HttpClientHandler并发处理请求的数量,其默认值为2。我们可以根据应用的需求以及系统的性能,在主程序中通过设置ServicePointManager.DefaultConnectionLimit来对其进行调整。



