Это очень старая статья, в которой объясняется, почему HttpClient должен использоваться повторно, но не объясняется, как обрабатывать изменения DNS. Это объясняется в Singleton HttpClient? Остерегайтесь этого серьезного поведения и как это исправить . Это все еще касается только одного соединения.
Очевидный ответ - избегать одноэлементных HttpClients, но все же использовать их некоторое время. Кроме того, разные сокеты используются для подключения к разным серверам, что означает, что нам действительно нужно повторно использовать (и перерабатывать) сокеты для каждого сервера. Решение пришло позже в виде HttpClientFactory.
Приятно то, что HttpClientFactory представляет собой пакет .NET Standard 2.0, Microsoft.Extensions.Http , который может использоваться как .NET Core, так и .NET Old, а не только ASP.NETОсновные приложения. Я использую его, например, в консольных приложениях.
Очень хорошее введение - HttpClientFactory в ASP.NET Core 2.1 (PART 1) от Стива Гордона и all егостатьи в этой серии .
Короче говоря, каждый раз, когда нам нужен HttpClient, мы запрашиваем у фабрики экземпляр:
[Route("api/[controller]")]
public class ValuesController : Controller
{
private readonly IHttpClientFactory _httpClientFactory;
public ValuesController(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
[HttpGet]
public async Task<ActionResult> Get()
{
var client = _httpClientFactory.CreateClient();
var result = await client.GetStringAsync("http://www.google.com");
return Ok(result);
}
}
Делегаты HttpClient работают с SocketClientHandler. Вот что нужно использовать повторно. HttpClientFactory создает экземпляры HttpClient, которые повторно используют обработчики сокетов из пула обработчиков сокетов. Обработчики периодически перезагружаются, чтобы заботиться об изменениях DNS.
Еще лучше, HttpClientFactory можно комбинировать с Polly , чтобы добавить логику повторения в экземпляры HttpClient. Это делает это за сценой, настраивая обработчики.