You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

发起HTTP POST请求时出现411(Length Required)错误求解决方案

HTTP POST请求出现411 (Length Required)错误的解决思路

遇到的错误

System.Net.Http.HttpRequestException: Response status code does not indicate success: 411 (Length Required).

相关代码

最初使用HttpRequestMessage的实现

public async Task<MyResponse?> MyMethodAsync(MyRequest request, string url, string accessToken)
{
    var client = new HttpClient();

    var requestJson = JsonConvert.SerializeObject(request);

    var httpRequest = new HttpRequestMessage(new HttpMethod("POST"), url);
    httpRequest.Content = new StringContent(requestJson, Encoding.UTF8, "application/json");
    httpRequest.Headers.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}");
    //httpRequest.Headers.TryAddWithoutValidation("Content-Length", requestJson.Length.ToString()); //Adding this didn't help

    var response = await client.SendAsync(httpRequest);
    response.EnsureSuccessStatusCode();

    var result = await response.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<MyResponse>(result);
}

尝试改用PostAsync的实现

client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "application/json");
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}");
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Length", requestJson.Length.ToString());
var response = await client.PostAsync(url, content);

解决思路与建议

  • 禁止手动在请求Headers中添加Content-Length:Content-Length属于请求内容(Content)的头字段,而非HttpRequestMessage的Headers。StringContent会自动根据内容计算并添加该头,手动添加到请求Headers会导致服务器无法识别正确的长度,反而引发问题。

  • 检查序列化后的内容是否为空:如果requestJson是空字符串,StringContent可能不会生成Content-Length头,触发服务器的411校验。可以在序列化后增加空值检查:

    var requestJson = JsonConvert.SerializeObject(request);
    if (string.IsNullOrWhiteSpace(requestJson))
    {
        requestJson = "{}"; // 或者根据接口要求设置合法的空请求体
    }
    
  • 修正PostAsync的写法:不要把Content-Type加到DefaultRequestHeaders中,该字段属于Content的属性,应通过StringContent的构造函数指定:

    var client = new HttpClient();
    // 只把非内容相关的头加到默认请求头
    client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer {accessToken}");
    client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "application/json");
    
    var requestJson = JsonConvert.SerializeObject(request);
    // 正确设置Content-Type
    var content = new StringContent(requestJson, Encoding.UTF8, "application/json");
    
    var response = await client.PostAsync(url, content);
    response.EnsureSuccessStatusCode();
    
  • 排查自定义Handler影响:如果项目中使用了自定义的DelegatingHandler,检查是否有逻辑意外移除或修改了Content-Length头。

内容的提问来源于stack exchange,提问作者user007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:23:25