2

Использовал 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;

}

Xzizz
  • 1,592
  • При 302 не должно быть исключения, покажите код метода и какое именно исключение возникает, покажите его текст. с https на http - быть может наоборот? Ну меня на .NET Core все редиректы работают как надо без дополнительных настроек. – aepot Jan 17 '21 at 14:09
  • Не задаете ли вы случаем заголовки Host или Origin при запросе? Если да, то уберите, и все заработает. – aepot Jan 17 '21 at 14:18
  • 1
    @aepot да - задавал, спасибо! попробую. – Xzizz Jan 17 '21 at 14:20
  • @aepot стоп, а я ведь и на Net.Framework тоже их задавал... – Xzizz Jan 17 '21 at 14:22
  • В .NET Framework HttpClient использует другой (старый) транспорт, он может логически по-другому реагировать на эти заголовки. – aepot Jan 17 '21 at 14:24
  • @aepot исключил все заголовки кроме User-Agent и всё равно на 302 всё стопится – Xzizz Jan 17 '21 at 14:30
  • Я работаю с HttpClient вот так, редиректы отрабатывают как надо. – aepot Jan 17 '21 at 14:35
  • 1
    https://github.com/dotnet/runtime/issues/23801 – Grundy Jan 17 '21 at 14:38
  • Попробуйте убрать HttpCompletionOption.ResponseHeadersRead, просто SendAsync(request). Я если честно не уверен, оно влияет как-то или нет. – aepot Jan 17 '21 at 14:39
  • Судя по всему проблема именно с перенаправлением с https на http и на .net core оно запрещено. В качестве workaround предлагают отключить авторедирект и руками обрабатывать заголовок 302 – Grundy Jan 17 '21 at 14:40
  • @Grundy да, это не адекватный редирект, и его не должно существовать в природе. Тогда автору рекомендую либо отрабатывать вручную это перенаправление, либо обращаться сразу к HTTP. Авторедирект можно не отключать, так как исключение бросает именно EnsureSuccessStatusCode(), то есть всю работу можно провести до него. – aepot Jan 17 '21 at 14:43
  • Но заголовок Host все равно не надо задавать, при редиректе на другой сайт будет ошибка установки SSL соединения в этом случае при использовании HTTPS. – aepot Jan 17 '21 at 14:46
  • 1
    Вот здесь более-менее вменяемый пример как отработать редирект вручную. – aepot Jan 17 '21 at 15:06

0 Answers0