2011-09-29 15 views
6

ho il seguente codice con cui si scarica una pagina web in un array di byte e quindi stamparlo con Response.Write:Aggiungere intestazioni di richiesta con WebClient C#

WebClient client = new WebClient(); 

byte[] data = client.DownloadData(requestUri); 

    /***********  Init response headers ********/ 
    WebHeaderCollection responseHeaders = client.ResponseHeaders; 
    for (int i = 0; i < responseHeaders.Count; i++) 
     { 
      Response.Headers.Add(responseHeaders.GetKey(i), responseHeaders[i]); 
     } 
    /***************************************************/ 

Oltre delle intestazioni di risposta, ho bisogno per aggiungere anche intestazioni di richiesta. Io cerco di farlo con il seguente codice:

/***********  Init request headers ********/ 
    NameValueCollection requestHeaders = Request.Headers; 
    foreach (string key in requestHeaders) 
    { 
     client.Headers.Add(key, requestHeaders[key]); 
    } 
    /***************************************************/ 

Tuttavia non funziona ed ottengo la seguente eccezione:

Questa intestazione deve essere modificato utilizzando il nome property.Parameter appropriata: nome

Qualcuno potrebbe aiutarmi con questo? Qual è il modo corretto di aggiungere intestazioni di richiesta con WebClient?

Grazie.

+0

Quello che stai cercando di fare sembra strano per me. Devi passare alcune intestazioni dalla tua richiesta di pagina al WebClient? –

+0

Quello che cerco di fare è: scaricare una pagina utilizzando WebClient. Per farlo correttamente, ho bisogno di passare le intestazioni delle richieste corrette, come User-Agent, ecc. Queste dovrebbero essere le stesse intestazioni che vengono inviate dal browser quando carico una pagina in una finestra del browser. – cycero

+0

Che tipo di eccezione? –

risposta

5

La collezione intestazioni "protegge" alcune delle possibili intestazioni come descritto nella pagina di MSDN qui: http://msdn.microsoft.com/en-us/library/system.net.webclient.headers.aspx

Quella pagina sembra dare tutta la risposta che cercavi, ma citare la parte importante:

Alcune intestazioni comuni sono considerate limitate e sono protette dal sistema e non possono essere impostate o modificate in un oggetto WebHeaderCollection. Qualsiasi tentativo di impostare una di queste intestazioni limitate nell'oggetto WebHeaderCollection associato a un oggetto WebClient genera un'eccezione successiva quando si tenta di inviare la richiesta WebClient .

intestazioni limitati protetti dal sistema includono, ma non sono limitati a quanto segue:

Date 

Host 

Inoltre, alcune altre intestazioni sono anche limitato quando si utilizza un oggetto WebClient. Queste intestazioni restrizioni includono, ma non sono limitati al seguente:

Accept 

Connection 

Content-Length 

Expect (when the value is set to "100-continue" 

If-Modified-Since 

Range 

Transfer-Encoding 

La classe HttpWebRequest ha proprietà per impostare alcune delle suddette intestazioni. Se per un'applicazione è importante impostare queste intestazioni, , è necessario utilizzare la classe HttpWebRequest invece della classe WebRequest .

Sospetto che la ragione di ciò sia che molte delle intestazioni come Date e host devono essere impostate diversamente su una richiesta diversa. Non dovresti copiarli. In effetti, probabilmente suggerirei personalmente che non dovresti copiarne nessuno. Inserisci il tuo agente utente - Se la pagina che stai ottenendo si basa su un certo valore, allora penserei che tu voglia assicurarti di inviare sempre un valore valido piuttosto che affidarti all'utente originale per fornirti tali informazioni.

In pratica, devi capire cosa devi fare invece di trovare qualcosa che funzioni e che funzioni senza comprendere appieno ciò che stai facendo.

+1

Il mio problema è esattamente il problema. Devo impostare l'intestazione Accept, l'ho fatto invece: ((HttpWebRequest) request) .Accept = "application/json"; Sto usando WebRequest.Create. –

+0

Lo stesso problema è stato risolto con ((HttpWebRequest) webRequest) .UserAgent = Request.UserAgent; Era un Proxy – Morvael

1

Sembra che si sta cercando di impostare una certa intestazione che deve essere impostata utilizzando una delle proprietà WebClient (CachePolicy, ContentLength o ContentType)

Inoltre, non è molto buona per copiare ciecamente tutte le intestazioni, è bisogno di ottenere solo quelli di cui hai veramente bisogno.