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

.NET Core 6 Web API中如何在控制器子文件夹使用RoutePrefix?

解决控制器路由无法命中的问题

核心问题分析

  1. 误用Web API 2专属属性:ASP.NET Core中没有RoutePrefix属性,控制器级路由需要用[Route]定义。
  2. 中间件顺序错误:UseRouting必须在UseAuthentication和UseAuthorization之前执行,否则路由匹配逻辑会在认证授权之后运行,导致请求无法被正确解析。
  3. 默认路由模板的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:00:16