Почему я получаю 411 Длина требуется ошибка?

Вот как я называю сервис с.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();

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

Сведения об исключении: System.Net.WebException: удаленный сервер возвратил ошибку: (411) Требуемая длина.

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

9 ответов

Решение

Когда вы используете 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;

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

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

Когда вы делаете 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

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 свойство указывает, что запрос загружает данные и что только методы, которые загружают данные, могут быть установлены в свойстве Method.

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

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

Измените способ запроса метода с POST на GET .

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

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

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

поиск Гугл

2-й результат

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

Это довольно распространенная проблема, возникающая при попытке вызвать метод API на основе REST через POST. К счастью, есть простое решение для этого.

Это код, который я использовал для вызова API управления Windows Azure. Этот конкретный вызов API требует, чтобы метод запроса был установлен как POST, однако нет никакой информации, которую нужно отправлять на сервер.

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

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

request.ContentLength = 0;

У нас была очень неожиданная причина этой ошибки: мы передали заголовок, в котором был символ новой строки (в нашем случае заголовок токена носителя авторизации).

Мы подозреваем, что новая строка сбила с толку анализатор заголовков и заставила его думать, что дополнительных заголовков нет, что привело к удалению важных заголовков, таких как длина содержимого.

У меня была та же ошибка, когда я импортировал веб-запросы из сессий, запечатленных на fiddler, в веб-тесты Visual Studio. У некоторых запросов POST не было тега StringHttpBody. Я добавил пустой к ним, и ошибка исчезла. Добавьте это после тега Headers:

    <StringHttpBody ContentType="" InsertByteOrderMark="False">
  </StringHttpBody>
Другие вопросы по тегам