2010-07-17 4 views
9

Я могу загрузить это вручную в IE.WebClient 403 Forbidden

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 клиент = новый WebClient(); client.DownloadFile (адрес, имя файла);

Показать Исключение: 403 Forbidden

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

другие

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 Forbidden в хроме, это может быть IE обналичивания вашего логина и пароля – volody

+0

@ volody: Как я могу это сделать в коде? – Begtostudy

ответ

1

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

+0

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 Но, также, система. Net.WebException: Удаленный сервер ответил на ошибку: (403) Запрещено. – Begtostudy

+0

Я бы посмотрел на этот проект http://desktopgooglereader.codeplex.com/ , где, похоже, они решили эту проблему, включая недавние изменения от Google – philhobgen

1

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

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

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

+0

http://scholar.google.com/scholar.ris ? q = info: sskrpr5jlLwJ: academar.google.com/&output=citation&hl=zh-CN&as_sdt=2000&oe=GB&ct=citation&cd=1 Я использовал Fiddler. Но есть ли клиент/куки/транспорт, который следует использовать? – Begtostudy

49

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

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

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

Вот и все.

+0

Спасибо @ Borg8, лучшее решение для меня работало :) – Nozim

+0

Отличный человек решения. Я люблю простоту. +1, но я бы хотел, чтобы я мог +2. –

+1

+1 - Я подозревал это, но только как теорию. Невероятно, что они блокируют запросы без каких-либо пользовательских агентов. Довольно сообразительный, когда вы об этом думаете. –

0

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

Я закончил тем, что добавить заголовки:

  • Accept
  • Accept-Encoding
  • Accept-Language
  • User-Agent
  • Upgrade нестабильным-запросы

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

1

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

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

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

Хотя, файл был загружен через получение HTTP в браузере, но он дает 403 ошибку через DownloadFile метода.

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

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

Screenshot

0

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;