ASP.NET Core 3.1 REST API接收form-data时参数全为null如何解决?
问题解决排查步骤
按照优先级从高到低逐一排查即可:
- 检查是否加了错误的[Consumes]特性
如果你的Controller或Action上标注了[Consumes("application/json")],会导致接口只处理JSON格式请求,直接忽略form-data类型的请求。可以删掉该特性,或者显式指定接收表单类型:
[HttpPost("upload")] [Consumes("multipart/form-data")] public ActionResult<UploadResponse> Upload([FromForm] UploadRequest req)
- 确认模型类有公共无参构造函数
ASP.NET Core模型绑定需要通过无参构造函数实例化接收对象,如果你给UploadRequest自定义了带参构造函数,必须显式补充公共无参构造:
public class UploadRequest { // 显式添加无参构造 public UploadRequest(){} public IFormFile File { get; set; } public string Format { get; set; } public string CaseId { get; set; } public string Description { get; set; } }
- 修正Postman请求配置
- 不要手动在Headers里加
Content-Type: multipart/form-data,Postman会自动生成带boundary参数的请求头,手动添加会丢失boundary导致服务端无法解析表单 - File字段的类型必须选择「File」(Postman的key输入框右侧下拉可选,默认是Text类型,选Text无法绑定到
IFormFile) - 所有form字段的key不要带前后空格,和类属性名保持一致即可(默认绑定不区分大小写)
- 检查是否有中间件提前消耗了请求体
如果你有自定义的日志、鉴权中间件读取了Request.Body,读取完成后必须重置流的位置,否则模型绑定器无法读取到表单内容:
// 中间件读取请求体后添加这行重置位置 context.Request.Body.Position = 0;
- 调整上传大小限制
如果上传文件超过默认30MB的大小限制,会导致表单解析失败,可以在Action上添加特性调整上限:
[HttpPost("upload")] [RequestSizeLimit(100 * 1024 * 1024)] // 按需求调整上限,示例为100MB public ActionResult<UploadResponse> Upload([FromForm] UploadRequest req)
- 确认服务注册配置正确
.NET 6+的Program.cs必须注册控制器服务并完成路由映射:
var builder = WebApplication.CreateBuilder(args); // 注册控制器服务 builder.Services.AddControllers(); var app = builder.Build(); // 映射控制器路由 app.MapControllers(); app.Run();
如果你使用的是ASP.NET Core 最小API模式,默认不支持
[FromForm]绑定复杂类对象,建议改用MVC控制器模式,或者手动读取表单内容赋值。
内容的提问来源于stack exchange,提问作者Martin Přívozník
相关产品推荐
相关产品推荐

