2010-07-17 5 views
9

Posso scaricarlo a mano in IE.WebClient 403 Proibito

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

Ma, utilizzando il codice di follow

client WebClient = new WebClient(); client.DownloadFile (indirizzo, nome file);

Mostra Eccezione: 403 Forbidden

Cosa c'è di sbagliato? Come posso farlo?

altri

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

Ho avuto 403 Forbidden in cromo, potrebbe essere IE incassare l'ID e la password – volody

+0

@ volody: Come posso fare nel codice? – Begtostudy

risposta

1

ho un 403 in IE, credo che è necessario il login per recuperare la risorsa. Il tuo browser potrebbe avere le credenziali nella cache ma la tua app non è progettata per accedere. O sei loggato a Google nel tuo browser - prova ad uscire e vedere se hai ancora accesso ....

+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 Ma, anche, Sistema. Net.WebException: il server remoto ha restituito un errore: (403) Proibito. – Begtostudy

+0

Darei un'occhiata a questo progetto http://desktopgooglereader.codeplex.com/ dove sembra che abbiano risolto questo problema incluse le recenti modifiche apportate da Google – philhobgen

1

Tu è necessario impostare le intestazioni http appropriate prima di chiamare il metodo DownloadFile.

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

Inserire valori corretti anziché questi punti di domanda potrebbe essere difficile. Dovrai scaricare Fiddler o qualche altro programma o estensione del browser per rivelare quali intestazioni HTTP vengono inviate a Google dal tuo browser web e sostanzialmente replicare la stessa richiesta nel tuo programma.

+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 Ho usato Fiddler. Ma ci sono client/cookies/trasporti, che dovrebbero essere usati? – Begtostudy

49

basta aggiungere un semplice linea prima di effettuare il download:

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

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

Questo è tutto.

+0

Grazie @ Borg8, la soluzione migliore ha funzionato per me :) – Nozim

+0

Grande soluzione uomo. Amo la semplicità. +1, ma vorrei poter +2. –

+1

+1 - Lo avevo sospettato, ma solo come teoria. Incredibilmente, bloccano le richieste senza agenti utente. Abbastanza intelligente quando ci pensi. –

0

La chiave per risolvere questo per me era di fare la richiesta una volta tramite codice, una seconda volta nel browser, registrare entrambe le richieste con Fiddler e verificare che le intestazioni corrispondano.

ho finito per dover aggiungere intestazioni:

  • Accetta
  • Accept-Encoding
  • Accept-Language
  • User-Agent
  • upgrade-insicuri-Richieste

Spero che questo aiuti le persone in futuro.

1

Questo è quello che è successo a me:

Stavo cercando di scaricare un (pubblico).file xls (tramite il metodo DownloadFile) che veniva scaricato comodamente da tutti i browser.

Dopo aver provato e faticato con tutte le risposte (ma senza fortuna), ho finalmente aperto lo Stack e notato qualcosa di strano (riferimento screenshot).

Anche se, il file è stato scaricato via sempre http in del browser, ma stava dando 403 errore tramite DownloadFile metodo.

Infine, ho appena modificato l'URL da http://something a https://something e ha funzionato correttamente.

Spero che questo aiuti!

Screenshot

0

403 può anche essere causato da problemi di TLS. Per verificare, è necessario controllare il testo dell'oggetto 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(); 
     } 
    } 

Se è TLS allora prova ad aggiungere questo al vostro codice per forzare TLS1.2.

Per .net4:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

Per .net4.5 o poi:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;