Вопрос по c#-4.0, concurrency, .net, dotnet-httpclient – Безопасно ли использовать HttpClient одновременно?

137

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

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

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

Ваш Ответ

3   ответа
15

Сообщение на форуме 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.
129

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

DeleteAsync
GetAsync
GetByteArrayAsync
GetStreamAsync
GetStringAsync
PostAsync
PutAsync
SendAsync
Это не верно; в разделе замечаний на странице MSDN, на которую вы ссылаетесь, говорится, что все функции GetAsync, PostAsync и т. д. безопасны для потоков.
@ischell: я могу заверить вас, что данный абзацwas not там в то время этот вопрос обсуждался.
Да, я не был уверен в этом, так как это кажется стандартным предупреждением обо всем на MSDN (и я помню, как читал некоторые блоги MSDN о том, как иногда это предупреждение неверно, так как оно применяется вслепую ко всему). Alex K
Таким образом, Microsoft разработала HttpClient для многократного использования, но затем у класса есть данные экземпляра для заголовков: client.DefaultRequestHeaders.Accept.Add (...);
В конце, но я хотел прокомментировать @cwills. DefaultRequestHeaders - это просто настройки по умолчанию. Если вам нужны разные заголовки для каждого запроса, вы можете создать новый StringContent (), установить для него дополнительные заголовки, а затем использовать перегрузку, которая принимает URI и HttpContent.
87

статья от Генрика Ф. Нильсена о 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;

Что делать, если имя пользователя и пароль могут меняться между потоками? это то, что я, кажется, не могу найти никого говорящего
да, это то, что я в итоге делал
@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; }
@NicholasDiPiazza: как часто это меняется? Если существует известный набор пар пользователь / пароль, то вы можете создать пул экземпляров HttpClient.
Обратите внимание, что повторное использование одного и того же HttpClient для всех ваших запросов может привести к устаревшим проблемам DNS:github.com/dotnet/corefx/issues/11224.

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