HttpClient
только IDisposable
, потому что HttpMessageHandler
равно IDisposable
.В действительности, это HttpMessageHandler
, который должен быть долгоживущим.
HttpClientFactory
работает, сохраняя долгоживущий HttpMessageHandler
внутри.Всякий раз, когда вы запрашиваете HttpClient
, он использует долгоживущий HttpMessageHander
и говорит HttpClient
, а не утилизировать его, когда утилизируется HttpClient
.
Выможно увидеть, что на GitHub :
public HttpClient CreateClient(string name)
{
// ...
// Get a cached HttpMessageHandler
var handler = CreateHandler(name);
// Give it to a new HttpClient, and tell it not to dispose it
var client = new HttpClient(handler, disposeHandler: false);
// ...
return client;
}
Таким образом, технически не имеет значения, кэшируете ли вы HttpClient
или удаляете его сразу - удаление ничего не делает (потому что было сказано не распоряжаться HttpClientHandler
, как это управляется HttpClientFactory
).
Относительно утилизации HttpClient
, MSDN говорит :
Утилизация клиента не требуется.Утилизация отменяет исходящие запросы и гарантирует, что данный экземпляр HttpClient не может быть использован после вызова Dispose.IHttpClientFactory отслеживает и удаляет ресурсы, используемые экземплярами HttpClient.Экземпляры HttpClient, как правило, могут рассматриваться как объекты .NET, не требующие удаления.
Сохранение одного экземпляра HttpClient в течение долгого времени является распространенным шаблоном, используемым до создания IHttpClientFactory.Этот шаблон становится ненужным после перехода на IHttpClientFactory.
Я подозреваю, что SocketException
s, которые вы видите, имеют другую причину.Может быть, задать новый вопрос, ориентированный на них?