Perché ottengo l’errore 411 Length richiesto?

Ecco come chiamo un servizio con .NET:

var requestedURL = "https://accounts.google.com/o/oauth2/token?code=" + code + "&client_id=" + client_id + "&client_secret=" + client_secret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code"; HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(requestedURL); authRequest.ContentType = "application/x-www-form-urlencoded"; authRequest.Method = "POST"; WebResponse authResponseTwitter = authRequest.GetResponse(); 

ma quando viene invocato questo metodo, ottengo:

Dettagli eccezione: System.Net.WebException: il server remoto ha restituito un errore: (411) Lunghezza richiesta.

cosa dovrei fare?

Quando si utilizza HttpWebRequest e il metodo POST, è necessario impostare un contenuto (o un corpo se si preferisce) tramite RequestStream. Ma, secondo il tuo codice, usando authRequest.Method = “GET” dovrebbe essere sufficiente.

Nel caso ti stia chiedendo il formato POST, ecco cosa devi fare:

 ASCIIEncoding encoder = new ASCIIEncoding(); byte[] data = encoder.GetBytes(serializedObject); // a json object, or xml, whatever... HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Method = "POST"; request.ContentType = "application/json"; request.ContentLength = data.Length; request.Expect = "application/json"; request.GetRequestStream().Write(data, 0, data.Length); HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

è necessario aggiungere Content-Length: 0 nell’intestazione della richiesta.

un esempio molto descrittivo di come testare è dato qui

Quando si effettua un POST HttpWebRequest, è necessario specificare la lunghezza dei dati che si inviano, ad esempio:

 string data = "something you need to send" byte[] postBytes = Encoding.ASCII.GetBytes(data); request.ContentLength = postBytes.Length; 

se non invii alcun dato, impostalo su 0, questo significa che devi solo aggiungere al tuo codice questa riga:

 request.ContentLength = 0; 

Di solito, se non invii alcun dato, scegliere il metodo GET è invece più saggio, come puoi vedere nella RFC HTTP

 var requestedURL = "https://accounts.google.com/o/oauth2/token?code=" + code + "&client_id=" + client_id + "&client_secret=" + client_secret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code"; HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(requestedURL); authRequest.ContentType = "application/x-www-form-urlencoded"; authRequest.Method = "POST"; //Set content length to 0 authRequest.ContentLength = 0; WebResponse authResponseTwitter = authRequest.GetResponse(); 

La proprietà ContentLength contiene il valore da inviare come intestazione HTTP Content-length con la richiesta.

Qualsiasi valore diverso da -1 nella proprietà ContentLength indica che la richiesta carica i dati e che solo i metodi che caricano i dati possono essere impostati nella proprietà Method.

Dopo che la proprietà ContentLength è impostata su un valore, tale numero di byte deve essere scritto nel stream della richiesta che viene restituito chiamando il metodo GetRequestStream o entrambi i BeginGetRequestStream e EndGetRequestStream .

per maggiori dettagli clicca qui

Ehi, sto usando Volley e ricevevo l’errore 411 del server, ho aggiunto al metodo getHeaders la seguente riga:

 params.put("Content-Length","0"); 

E ha risolto il mio problema

ricerca Google

2 ° risultato

 System.Net.WebException: The remote server returned an error: (411) Length Required. 

Questo è un problema piuttosto comune che si verifica quando si tenta di effettuare chiamate tramite un metodo API basato su REST tramite POST. Fortunatamente, c’è una soluzione semplice per questo.

Questo è il codice che stavo usando per chiamare l’API di gestione di Windows Azure. Questa particolare chiamata API richiede che il metodo di richiesta sia impostato come POST, tuttavia non sono necessarie informazioni che devono essere inviate al server.

 var request = (HttpWebRequest) HttpWebRequest.Create(requestUri); request.Headers.Add("x-ms-version", "2012-08-01"); request.Method = "POST"; request.ContentType = "application/xml"; 

Per correggere questo errore, aggiungi una lunghezza del contenuto esplicita alla tua richiesta prima di effettuare la chiamata API.

request.ContentLength = 0;

Ho avuto lo stesso errore quando ho importato richieste Web da sessioni catturate da violinista a webtest di Visual Studio. Alcune richieste POST non avevano un tag StringHttpBody. Ho aggiunto uno vuoto a loro e l’errore era sparito. Aggiungi questo dopo il tag Headers: