文件上传时遭遇HTTP 411 Length Required错误求助
解决HTTP 411 Length Required错误(仅大文件上传失败)
问题分析
小文件(TXT)上传正常,大文件(WORD/PDF)触发411错误,且两种请求都包含Content-Length字段。核心原因大概率是HttpClient在处理大内容时默认启用了分块传输(Transfer-Encoding: chunked),部分服务器会拒绝同时携带Content-Length和分块编码的请求,或是对分块传输的处理逻辑要求必须明确匹配的Content-Length,从而抛出411错误。
修复方案
方案1:强制禁用分块传输并显式计算总Content-Length
修改HttpClient请求发送逻辑,用HttpRequestMessage手动控制请求内容,禁用分块传输,确保Multipart内容的总长度被正确计算:
using (HttpClient _HttpClient = new()) { _HttpClient.DefaultRequestHeaders.Add("X-Auth-Token", _AuthToken); // 改用HttpRequestMessage替代直接PostAsync using var request = new HttpRequestMessage(HttpMethod.Post, _FileCreateUri); request.Content = _MultipartFormDataContent; // 禁用分块传输,显式设置总长度 request.Content.Headers.ContentLength = await _MultipartFormDataContent.ComputeLengthAsync(); request.Content.Headers.Remove("Transfer-Encoding"); using (HttpResponseMessage _HttpResMsg = await _HttpClient.SendAsync(request)) { if (_HttpResMsg.StatusCode == HttpStatusCode.Created) { _Result = await _HttpResMsg.Content.ReadAsStringAsync(); // 用await替代.Result避免阻塞 } // 建议添加错误日志,便于排查服务器返回的具体错误 else { var errorInfo = await _HttpResMsg.Content.ReadAsStringAsync(); // 可打印或记录errorInfo } } }
方案2:优化StreamContent的使用
避免将大文件一次性读入内存,直接使用FileStream,同时确保StreamContent的长度正确:
// 替换原代码中byte[]和MemoryStream的部分 using var fileStream = new FileStream(_FileDetails.FullName, FileMode.Open, FileAccess.Read); MultipartFormDataContent _MultipartFormDataContent = new(_Boundary) { { JsonContent.Create(_FileRoot), "profile" }, { new StreamContent(fileStream), "file", _FileDetails.Name } // 显式指定文件名参数 };
额外注意事项
- 移除手动修改Content-Type的冗余代码:
MultipartFormDataContent初始化时会自动生成带boundary的正确Content-Type头,无需手动移除再添加,否则可能导致头信息格式错误。 - 异步方法中全程使用
await,避免使用.Result引发死锁或性能问题。 - 确保
doc_profile.size字段值与实际文件长度完全一致,部分服务器会校验该值与请求内容长度的匹配性。
内容的提问来源于stack exchange,提问作者Krish
相关产品推荐
相关产品推荐

