HttpClientFactory.Create vs new HttpClient

Мне интересно, какова цель класса HttpClientFactory. Нет описания того, почему он существует в MSDN (см. Ссылку).

Существуют методы Create с более специализированными аргументами, но в основном мне интересно, в чем разница между вызовом без параметров и нормальным конструктором.


var httpClient = HttpClientFactory.Create();

В.С.

var httpClient = new HttpClient();

В большинстве примеров я вижу использование new HttpClient(), без каких - либо с using заявлений, даже если HttpClient класс является производным от IDisposable.

Поскольку класс HttpClient проистекает из IDisposable, существует ли какое-то объединение или кеширование, выполненное на заводе? Есть ли преимущества в производительности, или это не имеет значения?

Ответ 1

Фабрика - это вспомогательный метод, помогающий создать клиента, когда у вас есть несколько делегаций, работающих в канале. Делегирующие обработчики должны быть соединены вместе, чтобы сформировать конвейер. Эта фабрика позволяет вам передавать обработчики в виде массива, и завод позаботится о их объединении.

Полагаю, и не задумываюсь о том, что метод CreatePipeline может использоваться на стороне сервера для создания конвейера обработки сообщений для веб-API HttpServer.

Я рад, что вы не видите много примеров использования блоков вокруг HTTPClient, поскольку я борюсь с этой практикой за то, что чувствует себя годами. Хотя HttpClient реализует одноразовый, он обрабатывает только сценарии исключений, где он уничтожается, пока выполняется запрос. Экземпляры HttpClient должны быть долговечными. Утилизация их принудительно закрывает базовое TCP-соединение, которое должно быть объединено. HttpClient является потокобезопасным и его можно безопасно использовать много раз разными потоками. Это то, как он предназначен для использования, а не для одного использования, используя шаблон блока, который я вижу регулярно.

Ответ 2

Позвольте мне добавить к @DarrelMiller ответ:

Вы должны обратить внимание на время жизни ваших экземпляров HttpClient, если масштабирование имеет для вас какое-либо значение. Пожалуйста, обратитесь к разделу "Что такое накладные расходы на создание нового HttpClient для каждого звонка в клиенте WebAPI?