一般来说我们发送Web请求的时候,都是通过HttpClient。但是使用的时候会有两个问题:
- 因为HttpClient实现了IDisposable接口,每次使用如果都new一个对象的话,最后会耗尽你的主机端口。微软建议使用单例模式。
- 如果使用单例模式的话,端口是节省了,但是请求地址的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 臭名昭著的问题