как изменить поведение HttpClient?
Делаю 2й запрос и возвращается статус код 302
Если устанавливаю задержку между первым и вторым запросом, то получаю статус код 200
Тупо получив 302 чуть позже сделать новый запрос ? Или можно предпринять что то ещё ?
HttpClientHandler httpClientHandler = new()
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.Brotli,
AllowAutoRedirect = true
};
HttpClient httpClient = new(httpClientHandler);
.........
HttpResponseMessage response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead);
int responseHttpStatusCode = (int)response.StatusCode;
string otvet = await response.Content.ReadAsStringAsync();
Ответы (1 шт):
Смотрите, в чём проблема.
Вас перенаправляют (redirect) с защищённого соединения (HTTPS) на незащищённое (HTTP). Это не очень-то хорошо, вот .NET и не делает авто-редирект. (Это поведение обсуждается здесь.) И я бы тоже не советовал, т. к. вы снижаете безопасность для ваших пользователей, и информацию «в пути» (например, пароли, если вы их передаёте) сможет читать кто угодно.
На тот редкий случай, если вам можно игнорировать проблемы с безопасностью, делайте ручной редирект на Location из ответа:
HttpClient httpClient = new(httpClientHandler);
HttpResponseMessage response =
await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead);
const int maxRedirects = 20;
for (int i = 0; i < maxRedirects &&
response.StatusCode == HttpStatusCode.Redirect &&
response.Headers.Location != null; i++)
{
// следуем редиректу
var newRequest = new HttpRequestMessage(request.Method, response.Headers.Location)
{
/* установите другие нужные свойства тут */
};
response =
await httpClient.SendAsync(newRequest, HttpCompletionOption.ResponseHeadersRead);
}
if (response.StatusCode == HttpStatusCode.Redirect)
{
// с нами что, в собачки играют?
// слишком много редиректов, выбрасываем исключение
}
// и если другие ошибки, тоже
response.EnsureSuccessStatusCode();
string otvet = await response.Content.ReadAsStringAsync();