2013-02-22 20 views
20

Wenn ich Site www.livescore.com von HttpClient Klasse aufrufen bekomme ich immer Fehler "500". Wahrscheinlich Server blockiert Anfrage von HttpClients.HttpClient Anfrage wie Browser

1) Gibt es eine andere Methode, HTML von der Webseite zu erhalten?

2) Wie kann ich die Header einstellen, um HTML-Inhalt zu bekommen?

Wenn ich Kopfzeilen wie im Browser setze, bekomme ich immer einen großen kodierten Inhalt.

http_client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml"); 
    http_client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); 
    http_client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); 
    http_client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1"); 

3) Wie kann ich dieses Problem lösen? Irgendwelche Vorschläge?

ich in C# Windows 8 Metro Style-App mit und HttpClientClass

+1

Was passiert, wenn Sie diese URL mit Ihrem Browser holen? – Benny

+0

In der Browserseite korrekt angezeigt. Werfen Sie einen Blick auf http://www.livescore.com/ –

+0

Können Sie die gesamte Funktion veröffentlichen? – tttony

Antwort

48

Hier gehen Sie - beachten Sie die gzip codierte-Ergebnis, das Sie zurück zu dekomprimieren haben as permleroy:

private static async Task<string> GetResponse(string url) 
{ 
    var httpClient = new HttpClient(); 

    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml"); 
    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate"); 
    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0"); 
    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1"); 

    var response = await httpClient.GetAsync(new Uri(url)).ConfigureAwait(false); 

    response.EnsureSuccessStatusCode(); 
    using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) 
    using (var decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress)) 
    using (var streamReader = new StreamReader(decompressedStream)) 
    { 
     return await streamReader.ReadToEndAsync().ConfigureAwait(false); 
    } 
} 

Anruf so wie:

var response = await GetResponse("http://www.livescore.com/").ConfigureAwait(false); // or var response = GetResponse("http://www.livescore.com/").Result; 
+0

Ist es möglich, den gleichen Effekt ohne den Header "Accept-Encoding" zu erreichen? – pimbrouwers

0

ich glaube, Sie ziemlich sicher sein können, dass sie alles, was Entwickler zu stoppen von Screen-Scraping getan hat.

Wenn ich von einem Standard C# Projekt versuchen, diesen Code verwenden:

var request = WebRequest.Create("http://www.livescore.com "); 
    var response = request.GetResponse(); 

ich diese Antwort:

The remote server returned an error: (403) Forbidden. 
+1

Ja, ich weiß :) Aber wir sind Entwickler und wir müssen Probleme wie diese :) –

+0

Es gibt bezahlte Dienste da draußen. Dies ist illegales Hacking. Vielleicht solltest du eine andere Seite finden. – markoo

+2

Illegal? Warum? Wenn Sie diese Seite per Browser aufrufen, ist das auch illegal? –

2

Mehrere Dinge zur Kenntnis nehmen.

  1. Für diese Site müssen Sie einen Benutzeragenten angeben, oder es wird ein 500 HTTP-Fehler zurückgegeben.

  2. Eine GET-Anfrage an livescore.com antwortet mit einem 302 auf livescore.us. Sie müssen die Umleitung behandeln oder direkt anfordern livescore.us

  3. Sie benötigen ein gzip-komprimierte Antwort

Dieser Code funktioniert mit .NET 4 Client Profile dekomprimieren, ich werde Sie herausfinden lassen, wenn Es passt in eine Windows Store App.

var request = (HttpWebRequest)HttpWebRequest.Create("http://www.livescore.com"); 
request.AllowAutoRedirect = true; 
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"; 

string content; 

using (var response = (HttpWebResponse)request.GetResponse()) 
using (var decompressedStream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress)) 
using (var streamReader = new StreamReader(decompressedStream)) 
{ 
    content = streamReader.ReadToEnd(); 
} 
+0

OP verwendet nicht 'HttpWebRequest', sondern' HttpClient'. Aber Sie sind genau über Punkt 1 und 3. –

+1

Sie haben Recht; Nun, das OP scheint nicht auf HttpClient eingestellt zu sein (siehe seine erste Frage), also hoffentlich wird es immer noch nützlich sein :) – siger

+0

Danke! Ist eine gute Antwort, aber in Winodws 8 wird nur HttpClient unterstützt. –

20

Könnte dies versuchen, so gut Komprimierungsunterstützung hinzufügen:

var compressclient = new HttpClient(new HttpClientHandler() 
{ 
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip 
}); 

Dies fügt auch die Header hinzu.

Nach der gleichen Thread-Unterstützung ist jetzt in Windows Store Rahmen: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/429bb65c-5f6b-42e0-840b-1f1ea3626a42/httpclient-data-compression-and-caching?prof=required

Verwandte Themen