Безопасно ли использовать HttpClient одновременно?

Во всех примерах я могу найти использованияHttpClient, используется для однократных звонков. Но что, если у меня постоянная клиентская ситуация, когда несколько запросов могут быть сделаны одновременно? В принципе, это безопасно звонитьclient.PostAsync на 2 темы одновременно против одного и того же экземпляраHttpClient.

Я не очень ищу экспериментальные результаты здесь. В качестве рабочего примера может быть просто случайность (и при этом постоянная), а неудачный пример может быть проблемой неправильной конфигурации. В идеале я ищу какой-нибудь авторитетный ответ на вопрос обработки параллелизма в HttpClient.

 Mani Gandham03 июл. 2016 г., 21:43
Также прочитайте этот вопрос для получения дополнительной информации о том, как правильно использоватьHttpClient и распоряжаться им:stackoverflow.com/questions/15705092/…

Ответы на вопрос(3)

Решение Вопроса

По данным MSDNНачиная с .NET 4.5 следующие методы экземпляраare thread safe (спасибо @ischell):

DeleteAsync
GetAsync
GetByteArrayAsync
GetStreamAsync
GetStringAsync
PostAsync
PutAsync
SendAsync
 03 янв. 2013 г., 21:47
Это не верно; в разделе замечаний на странице MSDN, на которую вы ссылаетесь, говорится, что все функции GetAsync, PostAsync и т. д. безопасны для потоков.
 21 нояб. 2017 г., 17:10
В конце, но я хотел прокомментировать @cwills. DefaultRequestHeaders - это просто настройки по умолчанию. Если вам нужны разные заголовки для каждого запроса, вы можете создать новый StringContent (), установить для него дополнительные заголовки, а затем использовать перегрузку, которая принимает URI и HttpContent.
 11 июн. 2014 г., 10:12
Таким образом, Microsoft разработала HttpClient для многократного использования, но затем у класса есть данные экземпляра для заголовков: client.DefaultRequestHeaders.Accept.Add (...);
 03 янв. 2013 г., 23:05
@ischell: я могу заверить вас, что данный абзацwas not там в то время этот вопрос обсуждался.
 Alex K24 июн. 2012 г., 16:28
Да, я не был уверен в этом, так как это кажется стандартным предупреждением обо всем на MSDN (и я помню, как читал некоторые блоги MSDN о том, как иногда это предупреждение неверно, так как оно применяется вслепую ко всему).

Сообщение на форуме MSDN Хенрик Ф. Нильсен (один из главных архитекторов HttpClient).

Краткое резюме:

If you have requests that are related (or won't step on eachother) then using the same HttpClient makes a lot of sense. In genral I would recommend reusing HttpClient instances as much as possible.

статья от Генрика Ф. Нильсена о HttpClient, где он говорит:

& Quot;The default HttpClient is the simplest way in which you can start sending requests. A single HttpClient can be used to send as many HTTP requests as you want concurrently so in many scenarios you can just create one HttpClient and then use that for all your requests.& Quot;

 05 нояб. 2016 г., 01:46
Что делать, если имя пользователя и пароль могут меняться между потоками? это то, что я, кажется, не могу найти никого говорящего
 06 июл. 2017 г., 23:52
Обратите внимание, что повторное использование одного и того же HttpClient для всех ваших запросов может привести к устаревшим проблемам DNS:github.com/dotnet/corefx/issues/11224.
 23 июн. 2017 г., 19:41
да, это то, что я в итоге делал
 23 июн. 2017 г., 13:57
@NicholasDiPiazza: как часто это меняется? Если существует известный набор пар пользователь / пароль, то вы можете создать пул экземпляров HttpClient.
 04 окт. 2017 г., 16:13
@OhadSchneider Если считаете, что проблема ограничена ядром .net. Вы можете решить проблему с .net 4, вставив пользовательский HttpClientHandler в конструктор HttpClient, а затем установив параметр «ConnectionLeaseTimeout». Однако если в течение 100 секунд в конечную точку не будет отправлено ни одного запроса, соединение будет обновлено само по себе. Задача защищенного переопределения & lt; HttpResponseMessage & gt; SendAsync (запрос HttpRequestMessage, CancellationToken cancellationToken) {var sp = ServicePointManager.FindServicePoint (request.RequestUri); sp.ConnectionLeaseTimeout = 100 * 1000; }

Ваш ответ на вопрос