Один экземпляр многократно используемого HttpClient

У меня есть этот метод, и я понимаю, что экземпляр HttpClass будет создан для каждого его вызова. Работая, казалось бы, хорошо, я собираюсь переместить его и разместить его как частную собственность, доступную для каждого вызова метода. Могут быть и другие методы, использующие его в будущем. У меня нет информации о том, как часто эти вызовы будут происходить. (Существует try /catch), но для краткости он опущен.)

[OperationContract]
[WebGet(UriTemplate = "Poof"]
public async Task<String> GetPoof()
{
  String url = BaseUrl + "poofy";
  using (HttpClient client = new HttpClient())
  {
    client.DefaultRequestHeaders.TryAddWithoutValidation(
      "Authorization", GetAuthorizationSchema());
    HttpResponseMessage message = await client.GetAsync(url);
    return await message.Content.ReadAsStringAsync();
  }
}

Я думаю о чем-то вроде этого:

private HttpClient _Client
private HttpClient Client { get { return _Client ?? GetNewClient(); } }

[OperationContract]
[WebGet(UriTemplate = "Poof"]
public async Task<String> GetPoof()
{
  String url = BaseUrl + "poofy";
  HttpResponseMessage message = await client.GetAsync(url);
  return await message.Content.ReadAsStringAsync();
}

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

33 голоса | спросил Konrad Viltersten 15 62014vEurope/Moscow11bEurope/MoscowSat, 15 Nov 2014 20:07:25 +0300 2014, 20:07:25

2 ответа


41

Вам не нужны несколько экземпляров. На самом деле HttpClient разработан специально для сохранения и использования для нескольких запросов (см. HttpClient.DefaultRequestHeaders).

Об этом уже много написано, поэтому я перенаправляю вас на эти ресурсы:

ответил Jeroen Vannevel 15 62014vEurope/Moscow11bEurope/MoscowSat, 15 Nov 2014 20:43:24 +0300 2014, 20:43:24
1

Я предлагаю

private HttpClient Client { get { return _Client  = _Client ?? GetNewClient(); } }

Вместо

private HttpClient Client { get { return _Client ?? GetNewClient(); } }
ответил Moises Alexander Salazar Vila 7 MaramWed, 07 Mar 2018 02:47:41 +03002018-03-07T02:47:41+03:0002 2018, 02:47:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132