3

Вчера работал над проектом, всё было нормально. Сегодня при попытке скачать строку со страницы вылетает исключение

System.Net.WebException: "Удаленный сервер возвратил ошибку: (403) Запрещено."

Код

_webClient = new WebClient { Encoding = Encoding.UTF8 };
var devices = _webClient.DownloadString("http://h92761ae.beget.tech/json_devices.php");

В чём может быть проблема?

Nick Proskuryakov
  • 3,732
  • 2
  • 16
  • 40
dmepty
  • 618
  • Видимо так поработали, что вам закрыли доступ. – de_frag Mar 14 '18 at 07:11
  • Вы пытались после этого пройти по ссылке в браузере? Ибо возможно вас заблокировали или ваш ip. – Tivyram Mar 14 '18 at 07:13
  • 1
    @Tivyram Конечно, в браузере заходит без проблем – dmepty Mar 14 '18 at 07:14
  • @Tivyram ip динамический, менял несколько раз, всё одно и то же. Вчера работал с другого компьютера, но на данный момент проверить с него не могу – dmepty Mar 14 '18 at 07:16
  • ну так браузер шлет кучу других хидеров. И главное, правильный User-Agent – vitidev Mar 14 '18 at 07:16
  • @vitidev Пробовал подставлять и User-Agent, не помогало. Но до этого же работало и без него – dmepty Mar 14 '18 at 07:17
  • ну вы же понимаете, что запрос - просто набор хидеров и никакой магии. Посмотрите запрос в браузере и добейтесь его эквивалентности в программе и все – vitidev Mar 14 '18 at 07:19
  • 6
    Плохо подставляли: curl http://h92761ae.beget.tech/json_devices.php - 403 Forbidden. curl -H "User-Agent: Mozilla/5.0" http://h92761ae.beget.tech/json_devices.php - нужный вам json – de_frag Mar 14 '18 at 07:20
  • @defrag Право, пробовал подставлять, правда другой браузер... Ваш ответ помог, благодарю. – dmepty Mar 14 '18 at 07:26

1 Answers1

5

Иногда веб-серверы фильтруют клиентов (браузеры, программные веб-клиенты, etc) по HTTP-заголовку User-Agent. И в зависимости от значения этого заголовка веб-сервер может принят решение о вполне определенном ответе клиенту.

В конкретно этом случае веб-сервер (h92761ae.beget.tech) "не любит" обращения от "не реальных" браузеров, например:

curl http://h92761ae.beget.tech/json_devices.php

вернет код 403 Forbidden. Так как User-Agent в этом случае был curl/7.29.0

Поэтому нам можно попробовать притвориться реальным браузером с User-Agent-ом, например, Mozilla/5.0. И это решит данную проблему.

WebClient _webClient = new WebClient { Encoding = Encoding.UTF8 };
_webClient.Headers["User-Agent"] = "Mozilla/5.0";
var devices = _webClient.DownloadString("http://h92761ae.beget.tech/json_devices.php");
Console.WriteLine(devices);

Естественно, такой подход не решит проблемы, если вам будет запрещено ходить на этот сервер, например, по ip-адресу. Но это уже не вопрос данной темы.

de_frag
  • 2,480