ASP.NET Core 2.0 POST接口无JSON负载正常,带负载返回400错误
首先,咱们先定位核心问题:你的接口在不带JSON请求体时能正常返回,但带请求体就报400错误,这大概率是模型绑定失败导致的——要么是ASP.NET Core无法正确将请求的JSON转换为你使用的JObject,要么是请求体本身存在格式问题。
下面给你几个具体的排查和解决步骤:
1. 先确认curl请求是否正确传递了合法JSON
你提供的curl命令里缺少了传递请求体的-d参数!正确的带JSON体的POST请求应该像这样:
curl -X POST \ http://myapp/api/v1/emails/postself \ -H 'cache-control: no-cache' \ -H 'content-type: application/json' \ -d '{"to": "user@example.com", "subject": "Test Email"}'
另外一定要确保你传递的JSON格式完全合法(比如引号配对、逗号正确),哪怕一个小语法错误都会触发ASP.NET Core的400错误。
2. 用强类型模型代替JObject(推荐方案)
直接使用JObject虽然灵活,但模型绑定出错时很难定位具体问题。换成强类型模型不仅能提升代码可读性,还能让ASP.NET Core返回更详细的错误信息,帮你快速排查问题。
比如先创建一个匹配请求体的模型类:
public class EmailRequest { public string To { get; set; } public string Subject { get; set; } // 加上你业务需要的其他字段 }
然后修改你的接口代码:
[HttpPost("postself")] public IActionResult Post([FromBody] EmailRequest emailRequest) { // 先检查模型绑定是否成功 if (!ModelState.IsValid) { // 返回详细的模型错误信息 return BadRequest(ModelState); } try { var service = new EmailService(); var emailJson = JsonConvert.SerializeObject(emailRequest); var emailHtml = service.GenerateEmail(emailJson, false); return Json(new { Email = emailHtml }); } catch { return Json(new { Email = "error" }); } }
这样如果模型绑定失败,你会收到包含具体错误的响应(比如某个字段缺失、格式不符合要求等)。
3. 启用详细的模型绑定错误响应(针对JObject场景)
如果你坚持要使用JObject,可以在Startup.cs里配置让ASP.NET Core返回详细的错误信息,而不是只返回空的400响应。
在ConfigureServices方法中添加以下配置:
services.Configure<ApiBehaviorOptions>(options => { options.SuppressModelStateInvalidFilter = false; });
配置完成后,当模型绑定失败时,接口会返回包含ModelState错误详情的JSON,你就能清楚看到是哪里出了问题。
4. 检查Newtonsoft.Json的配置(ASP.NET Core 2.0专属)
ASP.NET Core 2.0默认使用Newtonsoft.Json处理JSON,但如果你的项目修改过JSON配置,可能会影响JObject的绑定。确保Startup.cs里的AddMvc配置没有破坏默认的JSON处理逻辑:
services.AddMvc() .AddJsonOptions(options => { // 自定义配置时避免影响JObject的序列化/反序列化 });
按照上面的步骤逐一排查,应该能快速解决这个400错误问题!
内容的提问来源于stack exchange,提问作者Corstiaan

