为什么我收到 411 Length required 错误?

问题描述 投票:0回答:10

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

我该怎么办?

c# .net httprequest http-status-code-411
10个回答
90
投票

当您使用 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;

46
投票

您需要在请求标头中添加

Content-Length: 0

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


16
投票
当您创建

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 中看到的那样


4
投票
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 标头发送的值。

ContentLength属性中除-1

之外的任何值都表示该请求上传数据,并且只允许在Method属性中设置上传数据的方法。

ContentLength

 属性设置为某个值后,必须将该字节数写入通过调用 
GetRequestStream
 方法或同时调用 
BeginGetRequestStream
EndGetRequestStream
 方法返回的请求流。

了解更多详情请点击

这里


2
投票
将请求方法的方式从 POST 更改为 GET ..


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

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

它解决了我的问题


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 调用之前。

请求.ContentLength = 0;


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

<StringHttpBody ContentType="" InsertByteOrderMark="False"> </StringHttpBody>
    

0
投票
导致此错误的原因非常令人惊讶:我们传递了一个包含换行符的标头(在我们的例子中是授权持有者令牌标头)。

我们怀疑换行符混淆了标头的解析器,并使其认为没有额外的标头,这导致它删除重要的标头,例如内容长度。


0
投票
就我而言,这是因为我的线路上没有“-d ''”。我猜想在不知不觉中终点是必需的。

© www.soinside.com 2019 - 2024. All rights reserved.