web-dev-qa-db-fra.com

HttpClient Request comme navigateur

Lorsque j'appelle le site www.livescore.com par la classe HttpClient, l'erreur toujours "500" .

1) Il existe une autre méthode pour obtenir du HTML à partir d'une page Web?

2) Comment puis-je définir les en-têtes pour obtenir du contenu HTML?

Lorsque je configure les en-têtes comme dans le navigateur, je reçois toujours un contenu codé étrange.

    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) Comment puis-je slove ce problème? Aucune suggestion?

J'utilise Windows 8 Metro Style App en C # et HttpClientClass

25
Norbert Pisz

Ici vous allez - notez que vous devez décompresser le gzip encodé - résultat vous obtenez selonmleroy :

private static readonly HttpClient _HttpClient = new HttpClient();

private static async Task<string> GetResponse(string url)
{
    using (var request = new HttpRequestMessage(HttpMethod.Get, new Uri(url)))
    {
        request.Headers.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
        request.Headers.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
        request.Headers.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
        request.Headers.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");

        using (var response = await _HttpClient.SendAsync(request).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);
            }
        }
    }
}

appelez tel que:

var response = await GetResponse("http://www.livescore.com/").ConfigureAwait(false); // or var response = GetResponse("http://www.livescore.com/").Result;
53
Jesse C. Slicer

Pourrait aussi essayer d’ajouter un support de compression: 

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

Cela ajoute les en-têtes aussi. 

Selon le même fil, le Windows Store supporte maintenant: http://social.msdn.Microsoft.com/Forums/windowsapps/en-US/429bb65c-5f6b-42e0-840b-1f1ea3626a42/httpclient-data-data-compression -and-caching? prof = required

21
user3285954

Plusieurs choses à prendre en compte.

  1. Ce site nécessite que vous fournissiez un agent d'utilisateur ou renvoie une erreur HTTP 500.

  2. Une requête GET adressée à livescore.com répond par un message 302 à livescore.us. Vous devez gérer la redirection ou demander directement livescore.us

  3. Vous devez décompresser une réponse compressée avec gzip

Ce code fonctionne avec le profil client .NET 4, je vous laisse donc savoir s'il convient à une application Windows Store.

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();
}
3
siger

Je pense que vous pouvez être pratiquement certain qu'ils ont tout mis en œuvre pour empêcher les développeurs de rayer l'écran.

Si j'essaye d'un projet C # standard en utilisant ce code:

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

Je reçois cette réponse:

The remote server returned an error: (403) Forbidden.
0
markoo