ASP.NET Core 6 API控制器可配置路由前缀404问题解决
ASP.NET Core 6 实现API控制器基础路径可配置
你遇到404的核心原因是**[ApiController]特性默认强制使用属性路由**,而你配置的是传统端点路由,两者不会协同工作。动作方法上的[HttpGet("MyDefaultAction")]只会让它响应/MyDefaultAction路径,和你配置的/temp前缀无关。
以下是两种可行的解决方案:
方案一:属性路由+可配置前缀(推荐)
这种方式符合ApiController的设计惯例,配置灵活,支持从配置文件读取前缀。
- 在配置文件中定义前缀(比如
appsettings.json):
{ "CustomApiPrefix": "/temp" }
- 在Program.cs中读取配置:
var builder = WebApplication.CreateBuilder(args); // 读取前缀,配置缺失时用默认值兜底 var apiPrefix = builder.Configuration["CustomApiPrefix"] ?? "/default";
- 修改控制器路由:
把控制器的[Route]特性绑定到配置的前缀,动作方法使用相对路由:
[ApiController] // 若不需要控制器名称出现在路径中,直接改为[Route($"{apiPrefix}")] [Route($"{apiPrefix}/[controller]")] public class MyController : ControllerBase { // 访问路径示例:/temp/MyController/MyDefaultAction [HttpGet("MyDefaultAction")] public IActionResult MyDefaultAction() { return new JsonResult("Hello"); } // 配置默认动作(访问/temp/MyController即可命中) [HttpGet("")] public IActionResult DefaultAction() { return new JsonResult("Default action response"); } }
如果不需要控制器名称在路径中,将控制器的[Route]改为[Route($"{apiPrefix}")],即可通过/temp/MyDefaultAction直接访问目标动作。
方案二:传统端点路由适配ApiController
若坚持用端点路由配置前缀,需要关闭ApiController的属性路由强制规则:
- 修改控制器动作的属性:
去掉动作上的路由路径参数,仅保留[HttpGet]:
[ApiController] public class MyController : ControllerBase { [HttpGet] public IActionResult MyDefaultAction() { return new JsonResult("Hello"); } }
- 修正端点路由配置:
你原代码存在字符串拼接语法错误(缺失闭合引号),修正后配置:
var app = builder.Build(); string configurablePrefix = "/temp"; app.MapControllerRoute( name: "MyRouteName", pattern: $"{configurablePrefix}/{{action=MyDefaultAction}}", defaults: new { controller = "MyController" }); app.Run();
- 关闭ApiController的属性路由强制:
在Program.cs的AddControllers环节添加配置:
builder.Services.AddControllers(options => { // 允许传统路由与ApiController共存 options.UseRouting(); });
配置完成后,访问/temp/MyDefaultAction或/temp(触发默认动作)均可正常响应。
内容的提问来源于stack exchange,提问作者TheHvidsten
相关产品推荐
相关产品推荐

