.NET Core 6 Web API中如何在控制器子文件夹使用RoutePrefix?
解决控制器路由无法命中的问题
核心问题分析
- 误用Web API 2专属属性:ASP.NET Core中没有
RoutePrefix属性,控制器级路由需要用[Route]定义。 - 中间件顺序错误:
UseRouting必须在UseAuthentication和UseAuthorization之前执行,否则路由匹配逻辑会在认证授权之后运行,导致请求无法被正确解析。 - 默认路由模板的
id参数未设为可选,会影响无参数请求的匹配。
具体修复步骤
1. 修正控制器的路由属性
将控制器上的[RoutePrefix]替换为ASP.NET Core支持的[Route],动作路由可直接合并到[HttpPost]中:
namespace AppWebSerivce.Controllers.CardDetails { [Route("api/CardDetails/Common")] public class CommonController : ControllerBase { [HttpPost("v1/GetStringName")] public string StringName() { return "SS"; } } }
2. 调整Program.cs的中间件顺序
按照ASP.NET Core规范顺序排列中间件:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme) .AddNegotiate(); builder.Services.AddAuthorization(options => { options.FallbackPolicy = options.DefaultPolicy; }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { // 开发环境启用异常页面,方便排查问题 app.UseDeveloperExceptionPage(); } app.UseDefaultFiles(); app.UseStaticFiles(); // 先启用路由匹配逻辑 app.UseRouting(); // 再执行认证、授权流程 app.UseAuthentication(); app.UseAuthorization(); app.UseCors(x => x .AllowAnyMethod() .AllowAnyHeader() .SetIsOriginAllowed(origin => true) .AllowCredentials()); // 配置默认路由,将id设为可选(加?) app.MapControllerRoute( name: "default", pattern: "api/{controller}/{action}/{id?}"); app.Run();
3. 验证请求正确性
- Postman必须使用POST方法请求地址:
http://localhost:5150/api/CardDetails/Common/v1/GetStringName - 确认项目启动端口确实为5150(可在
launchSettings.json文件中查看或修改)
内容的提问来源于stack exchange,提问作者NeoDotNet
相关产品推荐
相关产品推荐

