发起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
相关产品推荐
相关产品推荐

