Проблема параллелизма с использованием HttpClient и HttpRequestMessage - PullRequest
1 голос
/ 20 февраля 2020

Мой код выглядит примерно так:

private readonly HttpClient _httpClient;

public SomeConstructor(HttpClient httpClient){
     _httpClient = httpClient;
}

public void SomeMethod(string reqUrl, string payload){
     var result = GetResponseStringAsync(reqUrl, payload).GetAwaiter().GetResult();
     // do something with result
}

private async Task<string> GetResponseStringAsync(string reqUrl, string payload){
     using (var req = new HttpRequestMessage("POST", reqUrl)){
          using (var content = new StringContent(payload)){
               // Attach content headers here (specific for each request)

               req.Content = content;
               // Attach request headers here (specific for each request)
               // using req.Headers.TryAddWithoutValidation()

               using (var response = await _httpClient.SendAsync(req))
               {
                   return await response.Content.ReadAsStringAsync();
               }
          }
     }
}

Мне нужно отправлять запросы API с разными подписанными заголовками на запрос, в противном случае я вернусь 401 (неавторизовано). Тем не менее, когда я отправляю один запрос, я всегда получаю 200, указывая, что заголовки авторизации отправляются правильно. Однако, если я отправляю несколько запросов одновременно (скажем, с уровнем параллелизма, равным 10), только 1 запрос вернул 200, тогда как остальные 9 получили 401. Однако, если я нажму на эти 9 ссылок по отдельности, я получу 200 по каждому из них, как и ожидалось.

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

Add :

  1. У меня есть что-то вроде этого в моем AppHost: Container.Register<ISomeConstructor>(x => new SomeConstructor(new HttpClient()));, поэтому я уверен, что случайно не изменяю клиента где-либо еще
  2. Установка блокировки вокруг HttpClient (непосредственно перед SendAsyn c call) заставляет его работать и возвращает 200 с 100% времени, еще больше убеждая меня, что это проблема параллелизма
  3. Я развертываю и работаю на Mono 6.8.0.105 - это может быть проблема Mono? Я не смог найти никаких проблем / сообщений об ошибках по этому вопросу, хотя
...