生产环境K8s部署的.NET Core文件上传API报400错误求助
问题描述
我开发了一个接收IFormFile作为输入、将文件上传至云存储的.NET Core API Post方法,本地环境运行正常,但部署到Kubernetes集群的生产环境后调用该接口时抛出400错误。
接口代码如下:
[HttpPost("")] [Consumes("multipart/form-data")] public async Task<ActionResult> UploadFileAttachmentAsync(IFormFile file) { var result = await this.attachmentService.UploadAttachmentAsync(file); if (result != null) { return this.StatusCode(StatusCodes.Status200OK); } return this.StatusCode(StatusCodes.Status500InternalServerError); }
本地通过Swagger UI、Postman等工具调用接口(地址:https://localhost:4242/attachments)均能正常获取文件输入并完成上传,但使用生产环境地址https://test-api.example.com/attachments调用时,IFormFile输入验证失败,返回如下400错误信息:
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "Bad Request", "status": 400, "traceId": "00-7f70c739657ae91cccffdb47400cdf2f-0f3bd7b4bcce3774-00" }
排查方向
- Kubernetes Ingress配置问题:检查Ingress控制器(如NGINX)是否允许
multipart/form-data请求,是否设置了合理的client_max_body_size参数,部分Ingress默认会限制大体积请求,或未正确转发multipart相关请求头。 - 请求体大小限制:.NET Core默认限制multipart请求体大小为30MB,若上传文件超过该值会触发400错误。可在
Program.cs中调整限制:builder.Services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 104857600; // 设置为100MB }); - 请求参数名不匹配:确认生产环境调用时,文件参数的名称是否为
file(与接口方法的参数名一致),部分客户端工具可能默认使用files或其他名称,导致模型绑定失败。 - SSL终止后的请求头转发问题:若Ingress在Kubernetes中做了SSL终止,需确认是否完整转发
Content-Type、Content-Length等请求头,缺失这些头会导致.NET Core无法正确解析multipart表单。 - 中间件拦截干扰:检查生产环境是否添加了额外的中间件(如WAF、自定义日志中间件),这类中间件可能拦截或修改multipart请求内容,导致模型绑定失败。
- Pod资源不足:查看Kubernetes Pod的CPU、内存使用情况,若资源不足,请求处理时无法完成multipart表单解析,也会返回400错误。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

