.NET Core 6 API设置Content-Type为application/json时返回404求助
解决思路
先明确核心矛盾:你的API在不带Content-Type: application/json时能匹配到端点,但带该头时返回404,主要问题出在路由匹配逻辑和JSON请求体的模型绑定处理上,以下是具体排查修复步骤:
1. 修正路由匹配一致性
先核对请求路径和API路由是否完全对应:
- 你的控制器标注了
[Route("[controller]")],Action是[HttpPost("receive")],所以完整端点路径应为/Auction/receive(无全局路由前缀的情况)。但你测试用的是/auctionapi/Auction,这说明要么你在Program.cs中配置了全局路由前缀auctionapi,要么控制器路由应改为[Route("auctionapi/[controller]")]。 - 带
application/json头时,ASP.NET Core的路由匹配会更严格,路径不匹配直接返回404;而不带该头时,框架会宽松匹配未明确指定参数的Action,这就是为什么你之前能收到200。
2. 让Action兼容JSON请求体
当请求头指定application/json时,ASP.NET Core会自动尝试解析请求体,但你的Action未声明任何接收请求体的参数,结合[ApiController]的自动模型绑定逻辑,会导致路由匹配失败。可以用两种方式修复:
方式一:添加参数接收请求体
即使不需要使用请求体内容,也可以声明一个参数来承接,避免模型绑定报错:
[HttpPost("receive")] public async Task<IActionResult> Receive([FromBody] dynamic payload) { return Ok("Thanks for using the API"); }
如果后续需要验证请求体结构,也可以定义对应的模型类替换dynamic。
方式二:显式声明支持JSON并读取请求体
如果不想接收参数,可添加[Consumes]特性声明支持JSON类型,并手动读取请求体(避免框架因找不到参数解析请求体而报错):
[HttpPost("receive")] [Consumes("application/json")] public async Task<IActionResult> Receive() { // 读取请求体并丢弃,消除模型绑定冲突 await Request.Body.ReadToEndAsync(); return Ok("Thanks for using the API"); }
3. 检查全局路由配置
确保Program.cs中正确启用了控制器路由,没有遗漏关键配置:
var builder = WebApplication.CreateBuilder(args); // 添加控制器服务并配置JSON序列化 builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; }); var app = builder.Build(); app.UseRouting(); // 映射控制器端点 app.MapControllers(); app.Run();
4. 验证正确的请求路径
用匹配的路径测试:比如如果控制器路由是[Route("auctionapi/[controller]")],Action是[HttpPost("receive")],那么请求路径应为POST /auctionapi/Auction/receive,同时携带Content-Type: application/json头和请求体。
内容的提问来源于stack exchange,提问作者GeeksGoneBad
相关产品推荐
相关产品推荐

