2015-01-05 2 views
-1

Я пытаюсь загрузить html-код веб-сайта (yellowpages) в строку в моем приложении winforms C#.WebClient не будет работать на одном сайте

Я продолжаю получать ту же ошибку с одного веб-сайта. Все остальные сайты работают, я попытался общие из них, как: http://www.google.co.za и он работает, но когда я пытаюсь использовать http://www.yellowpages.co.za он выбрасывает:

An unhandled exception of type 'System.Net.WebException' occurred in System.dll Additional information: The remote server returned an error: (500) Internal Server Error.

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

Пожалуйста, найти свой код ниже

private string getPage() 
{ 
    using (WebClient client = new WebClient()) 
    { 
     return client.DownloadString("http://www.yellowpages.co.za/");    
    } 
} 
+2

По грубым предположениям, они делают некоторую проверку, чтобы люди не использовали данные, выходящие за пределы их условий использования. Вероятно, вы сами это видите, если используете HTTP-отладчик, такой как [Fiddler] (http://www.fiddlertool.com/) –

+0

Разве нет способа обойти это? Если я могу просмотреть и загрузить источник страницы в Chrome, почему я не могу это сделать на C#? – msbarnard

+1

@ user3815511: Chrome отправляет намного больше метаданных, таких как тип браузера, поддерживаемые механизмы сжатия, исходный IP-адрес запроса. Это несколько дает веб-серверам больше уверенности в том, что запрос поступает из браузера, а не скребка. Вышеприведенный код - это просто получить эту страницу с сообщением об инициирующем клиенте; например вы не загружаете CSS или изображения - вы можете очищать материал от сайта. Некоторые веб-сайты используют брандмауэры для блокировки таких запросов; это обычный способ внедрения DoS-атаки. –

ответ

2

Добавление заголовка исправления user-agent это.

private string getPage() 
{ 
    using (WebClient client = new WebClient()) 
    { 
      client.Headers.Add("user-agent", "foo"); 
      return client.DownloadString("http://www.yellowpages.co.za/");    
    } 
} 

То есть, я бы поставил действительное значение для user-agent и не заполнитель, как foo. См. rfc2616 для получения дополнительной информации о пользователе-агенте.

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