71

这就是我使用 .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)需要长度。

我应该怎么办?

4

9 回答 9

85

当您使用 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;
于 2013-08-21T08:25:42.640 回答
39

您需要添加Content-Length: 0您的请求标头。

这里给出了一个关于如何测试的非常描述性的例子

于 2013-08-21T08:26:49.483 回答
16

当您发出POSTHttpWebRequest 时,您必须指定要发送的数据的长度,例如:

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

如果您不发送任何数据,只需将其设置为 0,这意味着您只需将这一行添加到您的代码中:

request.ContentLength = 0;

通常,如果您不发送任何数据,则选择该方法更为明智,如您在HTTP RFCGET中所见

于 2013-08-21T08:25:40.417 回答
3
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-lengthHTTP 标头随请求一起发送的值。

属性中除-1以外的任何值ContentLength表示请求上传数据,并且仅允许在Method属性中设置上传数据的方法。

将该ContentLength属性设置为一个值后,该字节数必须写入通过调用GetRequestStream方法或调用方法返回的请求流BeginGetRequestStreamEndGetRequestStream

更多详情请点击这里

于 2015-08-21T09:49:04.893 回答
1

嘿,我正在使用 Volley 并收到服务器错误 411,我在 getHeaders 方法中添加了以下行:

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

它解决了我的问题

于 2015-03-04T08:05:59.170 回答
1

将您请求方法的方式从 POST 更改为 GET ..

于 2018-11-24T10:30:31.490 回答
0

谷歌搜索

第二个结果

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

这是尝试通过 POST 调用基于 REST 的 API 方法时出现的一个非常常见的问题。幸运的是,有一个简单的解决方法。

这是我用来调用 Windows Azure 管理 API 的代码。这个特定的 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;

于 2013-08-21T08:28:19.350 回答
0

当我将 web 请求从 fiddler 捕获的会话导入到 Visual Studio webtests 时,我遇到了同样的错误。一些 POST 请求没有 StringHttpBody 标记。我给他们加了一个空的,错误就消失了。在 Headers 标签后添加:

    <StringHttpBody ContentType="" InsertByteOrderMark="False">
  </StringHttpBody>
于 2018-04-17T12:48:31.107 回答
0

我们对这个错误有一个非常令人惊讶的原因:我们传递了一个包含换行符的标头(在我们的例子中是一个授权不记名令牌标头)。

我们怀疑换行符混淆了标头的解析器,并使其认为没有其他标头,这导致它丢弃了重要的标头,例如 content-length。

于 2021-12-06T17:17:40.027 回答