У меня есть внутренний корпоративный 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, и мои запросы содержат идентификаторы, которые будут отличаться междукаждый.
У кого-нибудь есть идеи, почему это происходит, и, что еще лучше, как обойти это?