2017-12-17 6 views
1

ich mit Httpclient eine Webseite zum Download versuche, ist, dass mein Code:Httpclient Exception werfen auf Umleitung

private async Task<string> _doRequest(string url) 
{ 
    string result = string.Empty; 

    var client = HttpClient; 
    using(var request = new HttpRequestMessage() 
    { 
    RequestUri = new Uri(url), 
    Method = HttpMethod.Get 
    }){ 
    using (HttpResponseMessage response = client.SendAsync(request).Result) 
     if (response.Headers.Location == null) 
     { 
     using (HttpContent content = response.Content) 
     { 
      result = await content.ReadAsStringAsync(); 
     } 
     } 
     else 
     { 
     result = await _doRequest(response.Headers.Location.ToString()); 
     } 
    }; 

    return result; 
} 

Httpclient ist eine statische Variable wie folgt initialisiert:

var handler = new HttpClientHandler(); 
    handler.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; 
    handler.AllowAutoRedirect = false; 
    HttpClient = new HttpClient(handler); 
    HttpClient.DefaultRequestHeaders.Add("User-Agent", @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"); 

Wenn ich versuche, auszuführen der Code mit url = "https://www.gls-italy.com/?option=com_gls&view=track_e_trace&mode=search&numero_spedizione=TE170187747&tipo_codice=nazionale"

ich folgendes: enter image description here

Das ist, was mich führen mit curl, um zu versuchen: enter image description here

Und hier bin ich verloren. Für mich sieht es wie ein gültiger 302 mit Standort aus, aber aus irgendwelchen Gründen glaubt HttpClient anders und wirft einfach eine Ausnahme aus.

Um zunächst klar zu sein, ich war auf AllowAutoRedirect Standardwert und Schub HttpClient angewiesen, um die Umleitung zu tun, es hat nicht funktioniert, ich bekam die gleiche Ausnahme, die mich dazu führen, es zu verwalten. Aber ohne Erfolg.

Wer weiß, was passiert? Wie funktioniert es?

Vielen Dank im Voraus.

+1

Es ist nicht das Httpclient. Ich habe Ihren Link mit HttpWebRequest versucht, aber ein WebException.SendFailure entsteht. Dies ist eine schlechte 302 Antwort. Die Verbindung ist geschlossen. Der Standort gibt an, dass die neue Adresse "https: // wwwdr." (...) lautet. Wenn Sie 'www' mit' wwwdr' den Server aswers korrekt ändern. – Jimi

+1

Beantwortet nicht Ihre Frage, sondern ein Heads-Up, das Sie vermeiden möchten, '.Result' in asynchronen Methoden zu verwenden. Dies kann zu Deadlocks führen. Wenn Sie auf client.SendAsync (request) warten, werden Sie das Ergebnis entpacken, ein Deadlock-Szenario vermeiden und möglicherweise mehr Nutzen aus Ihrem Thread ziehen. –

+0

@Jimi Ich weiß, wenn ich wwwdr anfrage, es funktioniert, können sie das ändern, ich brauche eine Möglichkeit, der Umleitung zu folgen, curl folgt der Umleitung, es muss einen Weg geben, um es auch von C# zu verwalten. –

Antwort

0

Objekte in Klassenstufe:

HttpClientHandler Http_Handler = new HttpClientHandler(); 
HttpClient Http_Client = new HttpClient(); 
CookieContainer HttpClCookieJar = new CookieContainer(); 

Httpclient-Setup-Stub:

private void HttpClient_Setup() 
{ 
    Http_Handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
    Http_Handler.AllowAutoRedirect = false; 
    Http_Handler.CookieContainer = HttpClCookieJar; 
    Http_Handler.UseCookies = true; 
    Http_Handler.UseDefaultCredentials = true; 
    Http_Client.Timeout = new TimeSpan(30000); 
    Http_Client = new HttpClient(Http_Handler); 
    Http_Client.DefaultRequestHeaders.Add("User-Agent", @"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0"); 
    Http_Client.DefaultRequestHeaders.Add("Accept-Language", "it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3"); 
    Http_Client.DefaultRequestHeaders.Add("Accept", "*/*"); 
    Http_Client.DefaultRequestHeaders.Add("Cache-Control", "no-cache"); 
} 

Async Httpclient-Anfrage:

public async Task<string> HttpClient_Request(string RequestURL) 
{ 
    string _responseHtml = string.Empty; 
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | 
              SecurityProtocolType.Tls11 | 
              SecurityProtocolType.Tls12; 
    try 
    { 
     using (HttpRequestMessage _requestMsg = new HttpRequestMessage()) 
     { 
     _requestMsg.Method = HttpMethod.Get; 
     _requestMsg.RequestUri = new Uri(RequestURL); 

     using (HttpResponseMessage _response = await Http_Client.SendAsync(_requestMsg)) 
     { 
      using (HttpContent _content = _response.Content) 
      { 
       _responseHtml = await _content.ReadAsStringAsync(); 
      }; 
     }; 
     }; 
    } 
    catch (HttpRequestException eW) 
    { 
     Console.WriteLine("Message: {} Source: {1}", eW.Message, eW.Source); 
    } 
    catch (Exception eX) 
    { 
     Console.WriteLine("Message: {} Source: {1}", eX.Message, eX.Source); 
    } 
    return _responseHtml; 
} 
Verwandte Themen