为什么我得到411长度要求错误

本文关键字:错误 为什么 | 更新日期: 2023-09-27 18:28:22

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

我该怎么办?

为什么我得到411长度要求错误

当您使用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方法会更明智,正如您在HTTPRFC

中看到的那样
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方法或同时调用BeginGetRequestStreamEndGetRequestStream方法返回的请求流。

有关更多详细信息,请单击此处

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

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

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

它解决了我的问题

谷歌搜索

第二个结果

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

这是一个很常见的问题,当试图拨打通过POST实现基于REST的API方法。幸运的是,有一个简单的修复方法这个。

这是我用来调用WindowsAzure管理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;

当我将web请求从fiddler捕获的会话导入到Visual Studio web测试时,也出现了同样的错误。某些POST请求没有StringHttpBody标记。我给它们添加了一个空的,错误就消失了。将其添加到Headers标签后:

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

我们有一个非常令人惊讶的错误原因:我们传递了一个包含换行符的标头(在我们的例子中是Authorization承载令牌标头)。

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