Долгоживущий HttpClient, созданный HttpClientFactory - PullRequest
0 голосов
/ 05 марта 2020

Я читал, что HttpMessageHandlers перерабатываются каждые 2 минуты, но я не уверен, назначен ли новый существующему HttpClient?

Я проверил его с помощью SetHandlerLifetime(TimeSpan.FromSeconds(5)); и даже через 2 минуты с бесчисленными запросами httpClient продолжает работать, что является хорошим признаком?

Означает ли это, что у меня нет причин для беспокойства по поводу изменений DNS / исчерпания сокетов?

Внутри ConfigureServices метод:

var myOptions = app.ApplicationServices.GetService<IOptionsMonitor<MyOptions>>();
HttpClient httpClient = app.ApplicationServices.GetService<IHttpClientFactory>().CreateClient();
MyStaticObject.Configure(myOptions, httpClient);

РЕДАКТИРОВАТЬ: Добавлен пример кода.

1 Ответ

1 голос
/ 06 марта 2020

Здесь есть несколько вещей, на которые стоит обратить внимание, первое из которых MyStaticObject действительно должно быть указано c? Если это произойдет, я бы рекомендовал вместо этого зарегистрировать его как Singleton, чтобы вы могли по-прежнему использовать внедрение зависимостей. Сделав это, вы можете зарегистрировать IHttpClientFactory и использовать его из своего кода. Ваш ConfigureServices метод может в конечном итоге выглядеть примерно так

public void ConfigureServices(IServiceCollection services)
{
  //The base extension method registers IHttpClientFactory
  services.AddHttpClient();
  services.AddSingleton<IMySingletonObject, MySingletonObject>();
}

Тогда в вашем классе потребления, MySingletonObject в этом случае, вы настроите его так:

public class MySingletonObject
{
  private readonly IHttpClientFactory _clientFactory;

  public MySingletonObject(IHttpClientFactory clientFactory)
  {
    _clientFactory = clientFactory;
  }

  public async Task SomeMethodThatUsesTheClient()
  {
    var client = _clientFactory.CreateClient();
    //use the client
  }
}

. Причина этого заключается в том, что IHttpClientFactory обрабатывает проблемы времени жизни и пула для нас. По документам :

Управляет пулами и временем жизни базовых экземпляров HttpClientMessageHandler. Автоматическое управление c позволяет избежать распространенных проблем DNS (Domain Name System), возникающих при ручном управлении временем жизни HttpClient.

Это происходит при выполнении вызова CreateClient, поэтому вы хотите сделать это внутри код с использованием клиента, в отличие от запуска вашего приложения.

В качестве примечания: если вам вообще не нужен этот класс в качестве одиночного, вы можете использовать расширение services.AddHttpClient<IMyClass, MyClass>() и внедрить HttpClient прямо в класс. Контейнер DI будет обрабатывать получение клиента с завода за кулисами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...