При попытке отправить запрос, получаю 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 шт):
Скажем так, нужный вам сайт "с изюминкой". Он не определился, 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, но чтоб до него добраться, придется пол клиента переписывать. Хотя, может что и упустил.