WebClient 403 Запрещено

Я могу скачать это вручную в IE.

http://scholar.google.com/scholar.ris?q=info:j8ymU9rzMsEJ:scholar.google.com/&output=citation&hl=zh-CN&as_sdt=2000&oe=GB&ct=citation&cd=0

Но, используя следующий код

WebClient client = new WebClient();
client.DownloadFile(address, filename);

Показать исключение: 403 Запрещено

Что не так? Как я могу это сделать?

другие

http://scholar.google.com/scholar.ris?q=info:sskrpr5jlLwJ:scholar.google.com/&output=citation&hl=zh-CN&as_sdt=2000&oe=GB&ct=citation&cd=1

Ответ 1

Я получаю 403 в IE, я думаю, вам нужно войти в систему, чтобы получить ресурс. Ваш браузер может хранить учетные данные, но ваше приложение не предназначено для входа в систему. Или вы вошли в Google в своем браузере - попробуйте выйти из системы и посмотреть, есть ли у вас доступ...

Ответ 2

Просто добавьте простую строку, прежде чем вы выполните загрузку:

string url = ... 
string fileName = ...

WebClient wb = new WebClient();
wb.Headers.Add("User-Agent: Other");   //that is the simple line!
wb.DownloadFile(url, fileName);

Что это.

Ответ 3

403 также может быть вызвано проблемами TLS. Чтобы проверить, вы должны проверить текст объекта WebException.Response.

     catch (WebException ex)
     {
        if (ex.Response != null)
        {
           var response = ex.Response;
           var dataStream = response.GetResponseStream();
           var reader = new StreamReader(dataStream);
           var details = reader.ReadToEnd();
        }
     }

Если это TLS, попробуйте добавить это в свой код, чтобы заставить TLS1.2.

Для .net4:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

Для .net4.5 или новее:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Ответ 4

У меня была эта проблема при попытке загрузить изображение с URL сайта SharePoint. В моем случае установки user-agent на Другое или пробела в заголовке было недостаточно, мне пришлось вместо этого установить user-agent:

client.Headers.Add("user-agent", " Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");

Это решение пришло из этого ответа.

Ответ 5

Вам нужно установить соответствующие заголовки HTTP, прежде чем вызывать метод DownloadFile.

WebClient webClient = new WebClient();
webClient.Headers.Add("???", "???");
webClient.Headers.Add("???", "???");
webClient.Headers.Add("???", "???");
webClient.DownloadFile(address, filename);

Поставить правильные значения вместо этих вопросительных знаков может быть сложным. Вам нужно будет загрузить Fiddler или другую программу или расширение веб-браузера, чтобы узнать, какие заголовки HTTP отправляются в Google вашим веб-браузером и в основном копируют один и тот же запрос в вашей программе.

Ответ 6

Вот что случилось со мной:

Я пытался загрузить (общедоступный).xls файл (через метод DownloadFile), который удобно загружался из всех браузеров.

После попытки и борьбы со всеми ответами (но не повезло) я наконец открыл стек и заметил что-то странное (см. скриншот).

Несмотря на то, что файл загружался через http в браузере, но он выдавал ошибку 403 с помощью метода DownloadFile.

Наконец, я просто изменил URL-адрес из http://something в https://something, и он работал нормально.

Надеюсь, это поможет!

Снимок экрана

Ответ 8

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

Мне пришлось добавлять заголовки для:

  • Принять
  • Accept-Encoding
  • Accept-Language
  • User-Agent
  • Upgrade-Незащищенные-запросы

Я надеюсь, что это поможет людям в будущем.