Как внедрить один HttpClient в несколько сервисов - PullRequest
1 голос
/ 13 февраля 2020

Я строю клиент API. Мой API довольно большой, поэтому я решил разделить его на 5 (частных) субклиентов, каждый из которых охватывает свою часть API. 5 клиентов не очень удобны в использовании, поэтому я бы хотел, чтобы их было меньше 1 (publi c) ApiClient, что будет служить своего рода фасадом над этими 5 клиентами. Дело в том, что я, вероятно, должен поделиться одним HttpClient между всеми этими суб-клиентами Насколько я знаю, я могу сделать что-то вроде этого:

services.AddHttpClient<SubClient1>(c => c.BaseAddress = new System.Uri("https://myapi.com"));

С помощью приведенной выше строки мой SubClient1 будет введен в мой publi c ApiClient с соответствующим экземпляром HttpClient уже настроен с BaseAddress. Теперь, как мне зарегистрировать все 5 моих субклиентов (SubClient1, SubClient2, SubClient3, ...), чтобы каждый из них получил одинаковые HttpClient? Я думаю, что код ниже создаст 5 HttpClient экземпляров:

services.AddHttpClient<SubClient1>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient2>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient3>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient4>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient5>(c => c.BaseAddress = new System.Uri("https://myapi.com"));

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 13 февраля 2020

Вы используете HttpClientFactory и таким образом делегируете конструкцию на HttpClient фабрике.

На основании документации: https://docs.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

Регистрация клиентских служб, как показано в предыдущем коде, заставляет DefaultClientFactory создавать стандартный HttpClient для каждой службы.

Это делается специально, чтобы вы могли настроить клиента для каждой службы.

С точки зрения ресурсов вы конвертированы. Это было первоначальной целью фабрики клиентов:

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

Пул обработчиков желателен, поскольку каждый обработчик обычно управляет своими собственными подключениями HTTP ; создание большего числа обработчиков, чем необходимо, может привести к задержкам соединения. Некоторые обработчики также поддерживают неограниченное время открытых соединений, что может помешать обработчику реагировать на изменения DNS.

Если вы не хотите использовать фабрику, которая является рекомендуемым способом, вы можете сделать что-то вроде этого : https://nodogmablog.bryanhogan.net/2017/10/reusing-httpclient-with-dependency-injection/

public void ConfigureServices(IServiceCollection services)
{
    Uri endPointA = new Uri("http://localhost:58919/"); // this is the endpoint HttpClient will hit
    HttpClient httpClient = new HttpClient()
    {
        BaseAddress = endPointA,
    };

    ServicePointManager.FindServicePoint(endPointA).ConnectionLeaseTimeout = 60000; // sixty seconds

    services.AddSingleton<HttpClient>(httpClient); // note the singleton
    services.AddMvc();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...