HttpClient очень медленно работает с аутентификацией Windows - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть внутренний корпоративный API, который я вызываю через HttpClient с основного сайта dotnet.API размещен на веб-сайте IIS, на котором включена проверка подлинности Windows.Аутентификация в API выполняется по этой схеме.Однако веб-запросы невероятно медленны, потому что процесс запрос-ответ, выполняемый HttpClient, содержит большие промежутки в около 0,4 секунды между ответом 401, полученным от сервера API, и HttpClient, отправляющим последующий (успешный) запрос с требуемым заголовком авторизации.

HttpClient обычно вводится через HttpClientFactory, но для ясности здесь приведен эквивалентный встроенный код (проблема существует, однако создается экземпляр HttpClient):

using (HttpClient httpClient = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }, true))
{
     httpClient.BaseAddress = new System.Uri( "https://localhost:60491/myapi/api/Internal/");
     var response = await httpClient.PutAsync(uri, content);

     await ValidateResponseAsync(response);
}

На серверезатем в журналах отображается разрыв в 0,4 секунды между ответом 401 на начальный запрос и следующим запросом с заголовком авторизации:

15: 56: 09.80114 [INF] HTTP "PUT" "/ api / Internal/ Documents / 989898989 "ответил 401 в 1,4533 мс.Пользователь null

15: 56: 10.17185 [INF] Запрос на запуск HTTP / 1.1 PUT http://localhost:60491/myapi/api/Internal/Documents/989898989 application / json 750

Это не проблема, связанная с сетью, так какСайт локальный.Я выполнил точно такой же запрос через веб-браузер, и разница между 401, полученным браузером, и следующим запросом составляет 0,001 секунды.Для всего запроса PUT (включая ответы 401 и 204) из браузера требуется 0,05 секунды, а из HttpClient - 0,4 секунды.Разница в производительности полностью связана с разрывом в отправке запроса с заголовком авторизации.

Я не могу использовать флаг PreAuthenticate на HttpClientHandler, так как это зависит от Uri, и мои запросы содержат идентификаторы, которые будут отличаться междукаждый.

У кого-нибудь есть идеи, почему это происходит, и, что еще лучше, как обойти это?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Разве вы не можете просто установить более быстрый тайм-аут?https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.timeout?redirectedfrom=MSDN&view=netframework-4.7.2

Я предполагаю, что каким-то образом это кодируется в запросе, а также используется внутри клиента.Я читал, что .net Core httpClient очень медленно в 2.0, гораздо быстрее в 2.1, вы также можете проверить настройки прокси, так как это может быть проблемой в .Net Core httpClient.

0 голосов
/ 22 ноября 2018

По умолчанию HttpClientHandler имеет свойство UseProxy, включенное по умолчанию.Я сталкивался с подобными ситуациями, когда он пытался найти прокси-сервер, используя системную настройку по умолчанию, установить «автоконфигурирование прокси-сервера», добавив значительную задержку.

При инициализации HttpClientHandler установить UseProxy вложь, и это может решить проблему.

0 голосов
/ 22 ноября 2018

Вы не должны создавать новый HttpClient для каждого запроса, что и делает ваш оператор использования.

https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

HttpClient предназначен для однократного создания и повторного использованияна протяжении всей жизни приложения.

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