При попытке отправить запрос, получаю 302(Found)

Я сталкивался уже с подобным, в тот раз помогало, просто http на https заменить, но тут это не помогает.

Вот сама ошибка с ссылкой

https://www.daisalux.com/en-us/pages/productos/soluciones.aspx?
DB=DaisaluxProEn&Cest=1&GAsp=54&Asp=113


System.AggregateException: One or more errors occurred. (Response status code does not indicate success: 302 (Found).)
 ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 302 (Found).
   at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
   at System.Net.Http.HttpClient.GetStringAsyncCore(Task`1 getTask)
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
   at Margaroli.Parsing.Parsing_Catalog(String html) in C:\Users\gokor\OneDrive\Рабочий стол\Tiferno\Margaroli\Parsing.cs:line 61

string linkItem = items.QuerySelector("a").GetAttribute("href").Replace("http","https");

var htmlItem = Program.Client.GetStringAsync(link2).Result;

В Fiddle все нормаьно, даже если пихаю с http


Ответы (1 шт):

Автор решения: EvgeniyZ

Скажем так, нужный вам сайт "с изюминкой". Он не определился, HTTP он или HTTPS.

Взглянем на первые запросы

7   301 HTTP    www.daisalux.com    /en-us/pages/productos/soluciones.aspx?DB=DaisaluxProEn&Cest=1&GAsp=54&Asp=113  248     text/html; charset=UTF-8                
9   302 HTTPS   www.daisalux.com    /en-us/pages/productos/soluciones.aspx?DB=DaisaluxProEn&Cest=1&GAsp=54&Asp=113  289 private text/html; charset=utf-8                
10  301 HTTP    www.daisalux.com    /en-us/pages/productos/soluciones.aspx?DB=DaisaluxProEn&Cest=1&GAsp=54&Asp=113&Sol=24802&Aca1=16604&Aca2=16526&Aca3=16984   307     text/html; charset=UTF-8                
11  200 HTTPS   www.daisalux.com    /en-us/pages/productos/soluciones.aspx?DB=DaisaluxProEn&Cest=1&GAsp=54&Asp=113&Sol=24802&Aca1=16604&Aca2=16526&Aca3=16984   12 648  private text/html; charset=utf-8                

Тут видим, что сайт при первом нашем посещении отправляет нас на HTTP ресурс (10), который в свою очередь опять перенаправляет обратно на HTTPS (11), а тут, как вы уже поняли по комментариям, прыгать с HTTPS на HTTP не очень и хорошо.

Что делать?

Самым простым решением будет отправить запрос, получить код ответа, а уже на его основе сделать новый запрос куда нам надо, нечто, на подобии этого:

private readonly static HttpClient httpClient = new();
static async Task Main()
{
    var link = "http://www.daisalux.com/en-us/pages/productos/soluciones.aspx?DB=DaisaluxProEn&Cest=1&GAsp=54&Asp=113";

    var request = new HttpRequestMessage(HttpMethod.Get, link);
    var responseMessage = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

    if (responseMessage is { StatusCode: HttpStatusCode.Redirect, Headers: { Location: {} }})
    {
        request = new HttpRequestMessage(HttpMethod.Get, responseMessage.Headers.Location);
        responseMessage = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
    }

    var content = await responseMessage.Content.ReadAsStringAsync();
}

Чтоб не писать этот код постоянно, можем вынести его в отдельный Handler:

public class RedirectHandler : DelegatingHandler
{
    public RedirectHandler(HttpMessageHandler innerHandler) => InnerHandler = innerHandler;

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var responseMessage = await base.SendAsync(request, cancellationToken);

        if (responseMessage is { StatusCode: HttpStatusCode.Redirect, Headers: { Location: { } } })
        {
            request = new HttpRequestMessage(HttpMethod.Get, responseMessage.Headers.Location);
            responseMessage = await base.SendAsync(request, cancellationToken);
        }

        return responseMessage;
    }
}

Тогда можем без проблем написать:

HttpClient httpClient = new(new RedirectHandler(new HttpClientHandler()));

....

var link = "http://www.daisalux.com/en-us/pages/productos/soluciones.aspx?DB=DaisaluxProEn&Cest=1&GAsp=54&Asp=113";
var content = await httpClient.GetStringAsync(link);

В теории, можно еще покопаться в сторону SslClientAuthenticationOptions.AllowRenegotiation, но чтоб до него добраться, придется пол клиента переписывать. Хотя, может что и упустил.

→ Ссылка