2013-08-21 4 views
33

Это, как я называю обслуживание с .NET:Почему я получаю ошибку 411 Length required?

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(); 

, но когда этот метод вызывается, я получаю:

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

что я должен делать?

ответ

54

Когда вы используете метод HttpWebRequest и POST, вам необходимо установить контент (или тело, если хотите) через RequestStream. Но, согласно вашему коду, использования authRequest.Method = "GET" должно быть достаточно.

В случае, если вам интересно о формате POST, вот что вы должны сделать:

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; 
+0

Не могли бы вы обратиться к моему вопросу «http://stackoverflow.com/questions/35308945/accessing-sftp-url-from-console-application-using-c-sharp»? У меня такая же проблема. Я пытаюсь нажать SFTP-адрес –

8

Когда вы делаете POST HttpWebRequest, необходимо указать длину данных, которые вы отправляете, что-то вроде:

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

если вы не отправлять какие-либо данные, просто установите его в 0, что означает, что вы просто нужно добавить в код строку:

request.ContentLength = 0; 

Обычно, если вы не отправлять какие-либо данные, они выбрали метод GET вместо мудрее, как вы можете видеть в HTTP RFC

+0

спасибо Лотт ... это будет полезно для меня –

+1

Хотя обычно можно было бы ожидать, посылаемые данные с POST, было бы неправильно и плохая практика, чтобы использовать GET, когда вы * изменение * данных на сервере. Запрос POST должен избегать прокси-кэшей между клиентом и сервером. GET в порядке, если данные извлекаются с сервера без каких-либо изменений на сервере в результате запроса. – Michael

17

вам нужно добавить Content-Length: 0 в заголовке вашего запроса.

очень описательный пример того, как проверить дается here

+0

Да, добавив Content-Length: 0. Благодаря! – Roboblob

1

Google search

2nd result

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

This is a pretty common issue that comes up when trying to make call a REST based API method through POST. Luckily, there is a simple fix for this one.

This is the code I was using to call the Windows Azure Management API. This particular API call requires the request method to be set as POST, however there is no information that needs to be sent to the server.

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

To fix this error, add an explicit content length to your request before making the API call.

request.ContentLength = 0;

1

Эй, я использую Volley и получаю ошибку сервера 411 , Я добавил к методу getHeaders следующий lin е:

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

И это решило мою проблему

2
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(); 

Свойство ContentLength содержит значение для отправки в качестве Content-length HTTP заголовка с запросом.

Любое значение, отличное от -1 в ContentLength собственности указывает на то, что данные запроса загрузки и что только методы, которые загружать данные могут быть установлены в свойстве метода.

После того, как свойство ContentLength устанавливается в значение, то число байтов должны быть записаны в поток запроса, который возвращается посредством вызова метода GetRequestStream или как BeginGetRequestStream и EndGetRequestStream методы.

для более подробной информации нажмите here

 Смежные вопросы

  • Нет связанных вопросов^_^