ti-enxame.com

HttpClient Request como navegador

Quando eu chamo o site www.livescore.com pela classe HttpClient, eu sempre recebo o erro "500". Provavelmente, o servidor bloqueou a requisição do HttpClients.

1) Existe algum outro método para obter o html da página web?

2) Como posso definir os cabeçalhos para obter conteúdo em html?

Quando defino cabeçalhos como no navegador, sempre recebo um conteúdo codificado.

    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) Como posso eliminar esse problema? Alguma sugestão?

Eu usando o Windows 8 Metro Style App em C # e HttpClientClass

25
Norbert Pisz

Aqui está - note que você tem que descompactar o resultado codificado do gzip que você recebe de volta de acordo com a notamleroy :

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);
            }
        }
    }
}

chame como:

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

Poderia tentar isso também para adicionar suporte a compressão: 

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

Isso adiciona os cabeçalhos também. 

De acordo com o mesmo suporte de thread está agora na estrutura da Windows Store: http://social.msdn.Microsoft.com/Forums/windowsapps/en-US/429bb65c-5f6b-42e0-840b-1f1ea3626a42/httpclient-data-compression -e-caching? prof = obrigatório

21
user3285954

Várias coisas para tomar nota.

  1. Esse site exige que você forneça um agente do usuário ou ele retorna um erro HTTP 500.

  2. Uma solicitação GET para o livescore.com responde com um 302 para o livescore.us. Você precisa lidar com o redirecionamento ou solicitar diretamente o livescore.us

  3. Você precisa descompactar uma resposta compactada por gzip

Este código funciona usando o .NET 4 Client Profile. Eu deixarei que você descubra se ele se encaixa em um aplicativo da 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

Acho que você pode ter certeza de que eles fizeram de tudo para impedir que os desenvolvedores copiem telas.

Se eu tentar de um projeto C # padrão usando este código:

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

Eu recebo esta resposta:

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