2013-02-22 2 views
20

Когда я вызываю сайт www.livescore.com классом HttpClient, я всегда получаю ошибку «500». Вероятно, сервер заблокировал запрос от HttpClients.HttpClient Запрос как браузер

1) Есть какой-либо другой способ получить html с веб-страницы?

2) Как я могу настроить заголовки для получения содержимого html?

Когда я устанавливаю заголовки, как в браузере, я всегда получаю стабильное кодированное содержимое.

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) Как я могу решить эту проблему? Какие-либо предложения?

Я с помощью Windows 8 Metro Style App в C# и HttpClientClass

+1

Что происходит, когда вы запрашиваете этот URL с помощью браузера? – Benny

+0

На странице браузера отображается правильная. Посмотрите http://www.livescore.com/ –

+0

Можете ли вы опубликовать всю функцию? – tttony

ответ

48

Здесь вы идете - обратите внимание, вы должны распаковать GZIP закодированный-результат вы получите обратно 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); 
    } 
} 

вызова, такие как:

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

Возможно ли реализовать тот же эффект без заголовка «Accept-Encoding»? – pimbrouwers

0

Я думаю, вы можете быть почти уверены, что они сделали все, чтобы остановить разработчик от экрана-выскабливания.

Если я пытаюсь от стандартного C# проекта, используя этот код:

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

Я получаю ответ:

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

Да, я знаю :) Но мы разработчики, и нам нужно решать такие проблемы: –

+0

Там есть платные сервисы. Это незаконный хакер. Возможно, вам стоит найти другой сайт. – markoo

+2

Незаконный? Зачем? Когда вы вызываете этот сайт браузером, тоже незаконно? –

2

Несколько вещей, чтобы принять к сведению.

  1. Этот сайт требует, чтобы вы предоставили пользовательский агент или он получил ошибку 500 HTTP.

  2. Запрос GET на lifcore.com отвечает 302 на livescore.us. Вы должны обращаться с перенаправлением или непосредственно запросить livescore.us

  3. Вы должны распаковать GZIP сжатый ответ

Этот код работает с помощью Client Profile .NET 4, я дам вам понять, если он подходит для приложения 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(); 
} 
+0

OP не использует 'HttpWebRequest', а скорее' HttpClient'. Но вы споткнулись о точках 1 и 3. –

+1

Вы правы; ну, похоже, что OP не использовал HttpClient (см. его первый вопрос), так что, надеюсь, он будет полезен :) – siger

+0

Спасибо! Хороший ответ, но в Winodws 8 поддерживается только HttpClient. –

20

могли бы попробовать это, а также для добавления поддержки сжатия:

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

Это также добавляет заголовки.

Согласно той же поддержке потоков в настоящее время в рамках Windows Store: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/429bb65c-5f6b-42e0-840b-1f1ea3626a42/httpclient-data-compression-and-caching?prof=required

Смежные вопросы