ASP Core 2接收POST请求数据为空问题求助(仅PostAsJsonAsync可正常接收)
我之前也踩过一模一样的坑!这种情况90%以上是请求的Content-Type头没设置对,或者JSON格式和模型不匹配导致的,咱们一步步排查解决:
1. 先盯紧Content-Type这个关键头
PostAsJsonAsync会自动帮你把请求头设为 Content-Type: application/json; charset=utf-8,还会自动把对象序列化为标准JSON。但如果你用Postman、curl或者前端JS手动发请求,很容易漏掉这个头——ASP Core 2的模型绑定默认只认Content-Type为application/json的请求体,没这个头的话,控制器根本不会去解析请求体里的JSON,自然拿不到数据。
举个正确的curl命令示例:
curl -X POST -H "Content-Type: application/json" -d '{"value": "测试内容"}' http://localhost:5000/api/yourendpoint
如果用Postman,一定要在「Headers」里添加Content-Type项,值设为application/json,然后在「Body」里选「raw」,格式切换到「JSON」再输入你的JSON内容。
2. 检查JSON和控制器模型的匹配度
假设你的控制器代码是这样的:
[HttpPost] public IActionResult Submit([FromBody] MyDataModel model) { // 处理逻辑 } public class MyDataModel { public string Value { get; set; } }
那你发送的JSON必须和模型的属性名大小写完全匹配(ASP Core 2默认区分大小写,除非你特意配置了不区分),比如正确的JSON应该是:
{"Value": "你要传的内容"}
如果模型属性是小写的value,那JSON也要对应写成{"value": "..."},大小写错了模型绑定会直接失败。
3. 别忘加[FromBody]特性
ASP Core 2里,对于复杂类型的模型绑定,必须给参数加上[FromBody]特性,告诉框架“从请求体里读取这个模型的数据”。如果没加,框架会默认从URL参数、表单字段里找数据,自然读不到请求体里的JSON。
4. 排查是否有自定义中间件搞事情
如果上面都没问题,那可能是你项目里的自定义中间件、过滤器或者模型绑定器修改了默认的请求解析逻辑。可以暂时注释掉非必要的中间件,再测试一次,看看是不是恢复正常了。
5. 直接读原始请求体排查
要是还是搞不定,你可以在控制器里直接读取原始请求体,看看数据到底有没有传过来:
using (var reader = new StreamReader(Request.Body)) { var rawRequestBody = await reader.ReadToEndAsync(); // 这里可以打个断点或者输出rawRequestBody,确认是不是你发送的JSON内容 }
如果rawRequestBody是空的,那就是你发送请求的工具没正确把数据传出去;如果有内容但模型没绑定上,那就是模型匹配或者Content-Type的问题。
内容的提问来源于stack exchange,提问作者alelom

