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

如何为控制器中的单个Action添加路由前缀?

同一控制器内为部分端点添加不同路由前缀的实现方法

不用非得把端点拆分到不同控制器,有几种简单直接的方式可以实现你的需求:

1. 直接在Action的Http属性中使用根路径路由模板

如果控制器本身已经设置了[Route("api/[controller]")],可以在需要修改前缀的Action上,用带~的路由模板覆盖控制器的前缀(~表示从根路径开始解析路由):

[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
    // 路由为 api/Your/{id}
    [HttpGet("{id}")]
    public async Task<IActionResult<Response>> Get(Guid id) 
    {
        // 实现逻辑
    }

    // 路由为 private/api/Your
    [HttpPost("~/private/api/[controller]")]
    public async Task<IActionResult> Create([FromBody]Request request) 
    {
        // 实现逻辑
    }
}

这种方式无需额外配置,适合少量需要修改前缀的Action。

2. 自定义路由属性简化重复配置

如果有多个Action需要添加private/api/前缀,可以自定义一个继承自RouteAttribute的特性,统一处理前缀:

public class PrivateApiRouteAttribute : RouteAttribute
{
    // 支持传入自定义模板,适配带参数的路由
    public PrivateApiRouteAttribute(string template) 
        : base($"private/api/{template}")
    {
    }

    // 默认使用控制器名称作为模板后缀
    public PrivateApiRouteAttribute() 
        : base("private/api/[controller]")
    {
    }
}

之后在Action上直接使用这个自定义属性即可:

[PrivateApiRoute]
[HttpPost]
public async Task<IActionResult> Create([FromBody]Request request) 
{
    // 实现逻辑
}

// 适配带参数的路由,最终路径为 private/api/Your/{id}
[PrivateApiRoute("[controller]/{id}")]
[HttpDelete]
public async Task<IActionResult> Delete(Guid id)
{
    // 实现逻辑
}

关于路由约定(Convention)的问题

路由约定通常是全局或控制器级别的配置,很难精准针对单个Action修改路由前缀,这也是你之前尝试效果不佳的原因。而上面两种方法都是直接针对Action做路由配置,灵活性更高,更匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:25:06