Использовал HttpClient.SendAsync в Net.Framework и не получал исключений при встрече с перенаправлением StatusCode 302
А попробовал перейти на Net.Core и HttpClient.SendAsync стал выдавать исключение
Как сделать так, чтобы перенаправление проходило и на Net.Core ?
- Хочу ещё отметить что перенаправление там идёт с
httpsнаhttp
Попробовал, но не помогло:
static readonly HttpClientHandler httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = true };
static readonly HttpClient client = new HttpClient(httpClientHandler);
Правильно ли я понимаю, что на Net.Core мне придётся самому отлавливать StatusCode-ы и в случае перенаправления, ловить Location и самому перенаправляться ?
Или всё таки можно установить какое то свойство и чтобы это не являлось исключением.
UPD 1:
В Net.Framework перенаправление проходит само по себе, т.е. получаю html тело страницы на которую произошло перенаправление.
А Net.Core выдаёт исключение.
HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
UPD 2 - Исключение:
System.Net.Http.HttpRequestException: "Response status code does not indicate success: 302 (Found)."
UPD 3 - Использование целиком
static readonly HttpClientHandler httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = true };
static readonly HttpClient client = new HttpClient(httpClientHandler);
private async Task<string[]> GetHtmlPageAsync(string param1, string url)
{
string[] otvet = new string[2];
using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
request.Headers.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36");
request.Content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("param1", param1),
// и другие
});
using HttpResponseMessage response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
int responseHttpStatusCode = (int)response.StatusCode;
otvet[0] = responseHttpStatusCode.ToString();
otvet[1] = await response.Content.ReadAsStringAsync();
return otvet;
}
с https на http- быть может наоборот? Ну меня на .NET Core все редиректы работают как надо без дополнительных настроек. – aepot Jan 17 '21 at 14:09HostилиOriginпри запросе? Если да, то уберите, и все заработает. – aepot Jan 17 '21 at 14:18HttpClientиспользует другой (старый) транспорт, он может логически по-другому реагировать на эти заголовки. – aepot Jan 17 '21 at 14:24HttpClientвот так, редиректы отрабатывают как надо. – aepot Jan 17 '21 at 14:35HttpCompletionOption.ResponseHeadersRead, простоSendAsync(request). Я если честно не уверен, оно влияет как-то или нет. – aepot Jan 17 '21 at 14:39EnsureSuccessStatusCode(), то есть всю работу можно провести до него. – aepot Jan 17 '21 at 14:43Hostвсе равно не надо задавать, при редиректе на другой сайт будет ошибка установки SSL соединения в этом случае при использовании HTTPS. – aepot Jan 17 '21 at 14:46