一般来说我们发送Web请求的时候,都是通过HttpClient。但是使用的时候会有两个问题:

  1. 因为HttpClient实现了IDisposable接口,每次使用如果都new一个对象的话,最后会耗尽你的主机端口。微软建议使用单例模式。
  2. 如果使用单例模式的话,端口是节省了,但是请求地址的DNS如果改变了的话,这个单例并不知道。

为了解决上面的两个问题,社区就出现了HttpClientFactory的开源方案。现在微软也将其添加到了. net core中。并且基于. net standard 2.0。所以要求你的 .net framework版本至少为4.6.1.

开始

添加一个控制台项目,并nuget上安装下面两个包:Microsoft.Extensions.Http和Microsoft.Extensions.DependencyInjection。
测试代码:

class Program
    {
        static void Main(string[] args)
        {
            Test();
            Console.Read();
        }

        static async void Test()
        {
            var serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
            var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
            var client = httpClientFactory.CreateClient();
            var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "http://www.baidu.com"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
    }

关于HttpClientFactory的更多使用方法请参考 引用3.
HttpClientFactory的原理请参考 引用4.


引用:
1.HttpClient在.NET Core中的正确打开方式
2.Can I use HttpClientFactory in a .NET.core app which is not ASP.NET Core?
3.启动 HTTP 请求
4.工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题