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

ASP.NET Core 8 Web API受保护端点应返回401却返回404求助

问题分析与解决方案

你的端点返回HTTP 404错误,核心原因是路由配置冲突/错误,而非认证配置问题——认证失败会返回401(未授权)或403(禁止访问),404表示请求的URL找不到对应的端点。

路由问题详解

ApartmentController的路由配置存在两种风格冲突:

  1. 控制器级路由为[Route("[controller]/[action]")],默认情况下所有方法的路由是/控制器名/方法名(比如Add方法的路由是/Apartment/Add)。
  2. 部分方法使用了带开头斜杠的绝对路由(比如[Route("/[controller]/{id:int}")]),这会完全覆盖控制器级的路由规则,导致这些方法的路由变为/Apartment/{id}(而非/Apartment/Get/{id})。

如果你的请求URL和实际路由不匹配,就会返回404。

修复方案

方案1:统一使用控制器级路由规则

修改方法上的路由,去掉开头斜杠,让方法路由与控制器路由组合:

[Authorize]
[ApiController]
[Route("[controller]/[action]")]
public class ApartmentController : ControllerBase
{
    private readonly IMediator _mediator;

    public ApartmentController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpPost]
    public async Task<IActionResult> Add([FromBody] AddApartmentDto dto)
    {
        // ... 原有逻辑
    }

    [HttpGet("{id:int}")]
    public async Task<IActionResult> Get(int id)
    {
        // ... 原有逻辑
    }
    
    [HttpGet("{id:int}/schedule")]
    public async Task<IActionResult> GetSchedule(int id)
    {
        // ... 原有逻辑
    }

    [HttpPost("schedule-viewing")]
    public async Task<IActionResult> ScheduleViewing([FromBody] ScheduleViewingDto dto)
    {
        // ... 原有逻辑
    }
}

调整后各方法路由:

  • Add:POST /Apartment/Add
  • Get:GET /Apartment/Get/123(123为示例ID)
  • GetSchedule:GET /Apartment/GetSchedule/123/schedule
  • ScheduleViewing:POST /Apartment/ScheduleViewing/schedule-viewing

方案2:采用RESTful风格路由(推荐)

修改控制器级路由为[Route("[controller]")],为每个方法配置简洁的HTTP动词+路由:

[Authorize]
[ApiController]
[Route("[controller]")]
public class ApartmentController : ControllerBase
{
    private readonly IMediator _mediator;

    public ApartmentController(IMediator mediator)
    {
        _mediator = mediator;
    }

    [HttpPost]
    public async Task<IActionResult> Add([FromBody] AddApartmentDto dto)
    {
        // ... 原有逻辑
    }

    [HttpGet("{id:int}")]
    public async Task<IActionResult> Get(int id)
    {
        // ... 原有逻辑
    }
    
    [HttpGet("{id:int}/schedule")]
    public async Task<IActionResult> GetSchedule(int id)
    {
        // ... 原有逻辑
    }

    [HttpPost("schedule-viewing")]
    public async Task<IActionResult> ScheduleViewing([FromBody] ScheduleViewingDto dto)
    {
        // ... 原有逻辑
    }
}

调整后各方法路由:

  • Add:POST /Apartment
  • Get:GET /Apartment/123
  • GetSchedule:GET /Apartment/123/schedule
  • ScheduleViewing:POST /Apartment/schedule-viewing

认证配置验证

你的Program.cs中的认证配置是正确的,待路由修复后:

  • 携带有效Token请求受保护端点,会正常返回业务响应。
  • 未携带Token/Token无效,会返回401未授权错误(而非404)。

内容的提问来源于stack exchange,提问作者user23416468

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:10:54