.Net Core HttpClientFactory для нескольких служб API

Sep 10 2020

У меня есть проект .Net Core, который должен подключаться примерно к 4 различным службам API, я не эксперт ни в одном коде HttpClient, но из того, что я обнаружил, было то, что вы обычно хотите повторно использовать только один экземпляр вашего HttpClient. Из того, что я могу сказать, общее мнение состоит в том, чтобы использовать HttpClientFactory в .Net Core, зарегистрировав его в своем классе Startup, а затем запросив его с помощью DI.

Теперь большинство моих заголовков по умолчанию и тому подобное в целом одинаковы, за исключением URL-адреса BaseAddress, как мне это сделать при подключении к 4 службам API-интерфейса diff? Должен ли я регистрировать 4 клиента с разными именами или иметь одного клиента со всей предустановленной информацией по умолчанию, а затем вручную настраивать его по мере необходимости, например, настраивая адрес?

Общие вопросы: поскольку я новичок в этом, было сказано, что я повторно использую один экземпляр HttpClient.

  1. Если я создам 4 разных именованных клиента для каждой службы API, не будет ли это создавать 4 экземпляра HttpClient при вызове метода .CreateClient ()?
  2. .CreateClient () создает новый экземпляр каждый раз, когда он вызывается, разве это не противоречит цели иметь один экземпляр HttpClient, если, скажем, мне нужно сделать 3 разных вызова одной службы API, каждый из этих вызовов будет вызывать файл. CreateClient (), чтобы установить какое-то соединение, и это создаст 3 экземпляра HttpClient?

Любая помощь для ясности будет оценена,

Благодаря!

Ответы

2 scharnyw Sep 10 2020 at 14:01

Целью использования IHttpClientFactoryне является повторное использование экземпляров HttpClient. Вместо этого он должен повторно использовать (путем объединения) экземпляров HttpMessageHandler(фактически HttpClientHandler, производных от абстрактного HttpMessageHandler), который является базовым объектом, который управляет HTTP-соединениями и сокетами. Эта диаграмма из Microsoft Docs хорошо это показывает.

Вы были обеспокоены тем, что частые звонки по IHttpClientFactory.CreateClient()номеру вызовут те же проблемы, что и частые звонки по адресу new HttpClient(). Тем не менее, это не так. Как объясняется в Microsoft docs , причина того, что частые вызовы new HttpClient()приведут к исчерпанию сокета, заключается в том, что этот конструктор создаст новый экземпляр HttpMessageHandler:

Однако проблема на самом деле не в HttpClient как таковом, а в конструкторе по умолчанию для HttpClient, поскольку он создает новый конкретный экземпляр HttpMessageHandler, который имеет проблемы с истощением сокетов и изменения DNS, упомянутые выше.

Вы можете видеть из исходного кода в IHttpClientFactoryтом , что он не использует конструктор без параметров из HttpClientв CreateClient(). Вместо этого он получает HttpMessageHandlerобъект из пула и вводит его в созданный HttpClient.

Независимо от того, используете ли вы типизированные или именованные клиенты, вы должны использовать экземпляр HttpClient как временный объект: его дешево создать, и вам не нужно кэшировать его на длительные периоды времени.