为什么我得到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)所需长度。

我该怎么办?

182693 次浏览

当您进行 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中看到的那样

当使用 HttpWebRequest 和 POST 方法时,必须通过 RequestStream 设置内容(如果愿意,还可以设置主体)。但是,根据您的代码,使用 authRequest。方法 = “ 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

给出了一个非常具有描述性的如何进行测试的例子 给你

谷歌搜索

第二个结果

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

这是在尝试调用 通过 POST 实现基于 REST 的 API 方法 这个。

这是我用来调用 WindowsAzure 管理 API 的代码。 这个特定的 API 调用要求将 request 方法设置为 但是,不需要将任何信息发送到 服务器。

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

若要修复此错误,请向请求添加显式内容长度 在进行 API 调用之前。

内容长度 = 0;

嘿,我正在使用 Volley 并得到 Server error 411,我在 getHeader 方法中添加了以下代码行:

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

这解决了我的问题

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方法返回的请求流。

有关详情,请按 给你

当我将从 Fiddler 捕获的会话中的 Web 请求导入 VisualStudio webtest 时,也出现了同样的错误。有些 POST 请求没有 StringHttpBody 标记。我给它们添加了一个空的,错误就消失了。在 Header 标签后面添加以下内容:

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

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

对于这个错误,我们有一个非常令人惊讶的原因: 我们传递了一个标头,其中有一个换行字符(在我们的示例中是 Authorization beerner 标记标头)。

我们怀疑,换行符混淆了标题解析器,使其认为没有其他标题,这导致它删除了像内容长度这样的重要标题。