You need to enable JavaScript to run this app. .NET API集成IdentityServer后自定义Controller路由返回404问题排查
优惠活动
大模型
产品
解决方案
定价
更多

.NET API集成IdentityServer后自定义Controller路由返回404问题排查

问题原因

  1. 控制器访问级别限制
    你定义的UserController使用了internal访问修饰符,ASP.NET Core 默认的控制器发现逻辑仅会将public修饰的类识别为控制器,internal类默认会被过滤掉,导致路由系统无法匹配到对应控制器,返回404。你其他未集成IdentityServer的服务如果控制器为public修饰,自然可以正常运行。
  2. 端点配置不匹配
    你在UseEndpoints中配置的是传统MVC路由MapControllerRoute,但[ApiController]特性强制要求控制器使用特性路由(即你添加的[Route("users")]注解),传统路由规则不会匹配带[ApiController]特性的控制器的特性路由。

另外你代码中存在重复注册IUserRequester的问题:先注册了Scoped生命周期的实现,后续又注册了Transient生命周期的实现,后面的注册会覆盖前面的,该问题不会导致404,但可能引发业务逻辑异常,建议根据需求保留唯一注册。

修复方案

方案1:修改控制器访问级别(推荐)

直接把UserController的internal修饰符改为public即可:

[Route("users")]
[ApiController]
public sealed class UserController : ControllerBase // 仅修改此处访问修饰符
{
    // 其余代码保持不变
}

如果你确实需要保留控制器为internal级别,可以在注册控制器时添加内部控制器发现支持:

_ = services.AddControllers()
    .AddNewtonsoftJson(options =>
        options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver())
    // 新增配置,允许扫描内部控制器
    .ConfigureApplicationPartManager(manager =>
    {
        manager.FeatureProviders.Add(new Microsoft.AspNetCore.Mvc.Controllers.InternalControllerFeatureProvider());
    });

方案2:修正端点配置

将Configure方法中的UseEndpoints配置替换为适配API特性路由的MapControllers:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers(); // 专门匹配特性路由的API控制器
});

修改完成后重启服务即可正常访问/users相关接口。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 02:15:02