You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:33:21