【问题标题】:Why I get 411 Length required error?为什么我得到 411 Length required 错误?
【发布时间】:2013-08-21 08:15:49
【问题描述】:

这就是我使用 .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


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    您需要在请求标头中添加Content-Length: 0

    here 给出了一个非常描述性的测试示例

    【讨论】:

    • 是的,添加 Content-Length: 0 有帮助。谢谢!
    • 简单而救生。谢谢!
    【解决方案3】:

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

    【讨论】:

    • 虽然通常人们希望数据通过 POST 发送,但在服务器上修改数据时使用 GET 是不正确和不好的做法。 POST 请求应避免客户端和服务器之间的任何代理缓存。如果从服务器获取数据,但不打算因请求而在服务器上进行任何更改,则 GET 是可以的。
    【解决方案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 方法或BeginGetRequestStreamEndGetRequestStream 方法返回的请求流。

    更多详情请点击here

    【讨论】:

      【解决方案5】:

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

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

      它解决了我的问题

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          Google search

          2nd result

          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;

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-03-09
                • 2021-11-02
                相关资源
                最近更新 更多