.NET API集成IdentityServer后自定义Controller路由返回404问题排查
问题原因
- 控制器访问级别限制
你定义的UserController使用了internal访问修饰符,ASP.NET Core 默认的控制器发现逻辑仅会将public修饰的类识别为控制器,internal类默认会被过滤掉,导致路由系统无法匹配到对应控制器,返回404。你其他未集成IdentityServer的服务如果控制器为public修饰,自然可以正常运行。 - 端点配置不匹配
你在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
相关产品推荐
相关产品推荐

