前言:
HttpClient 旨在实例化一次,并在应用程序的整个生命周期内重复使用。
实例化每个请求的 HttpClient 类将耗尽重负载下可用的插槽数。 这将导致 SocketException 错误。
一、正确使用 HttpClient 的示例
在使用 HttpClient 时应该使用单例模式。
public class GoodController : ApiController
{
private static readonly HttpClient HttpClient;
static GoodController()
{
HttpClient = new HttpClient();
}
}
二、使用 IHttpClientFactory 实现
在 .Net Core 2.1 后引入了 HttpClientFactory
1. 基本使用
// 在容器中注册服务
services.AddHttpClient();
使用构造函数注入使用 IHttpClientFactory
IHttpClientFactory _httpClientFactory;
public HomeController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
[HttpGet]
public async void Get()
{
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:5000/Home/Index");
var client = _httpClientFactory.CreateClient();
var response = await client.SendAsync(request);
var httpContent = response.Content;
var result = await httpContent.ReadAsStringAsync();
}
2. 命名不同的配置
// 在容器中注册服务
services.AddHttpClient();
services.AddHttpClient("local", c =>
{
c.BaseAddress = new Uri("http://localhost:5000");
c.DefaultRequestHeaders.Add("Accept", "application/json");
});
使用构造函数注入使用 IHttpClientFactory
IHttpClientFactory _httpClientFactory;
public HomeController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
[HttpGet]
public async void Get()
{
var client = _httpClientFactory.CreateClient("local");
var response = await client.GetAsync("Home/Index");
HttpContent httpContent = response.Content;
var result = await httpContent.ReadAsStringAsync();
}