【问题标题】:Add arbitrary route prefix to all attribute routes in webapi 2.2为 webapi 2.2 中的所有属性路由添加任意路由前缀
【发布时间】:2026-02-03 00:50:02
【问题描述】:

Web Api 2 global route prefix for route attributes? 有人问过这个问题。

我已经在使用属性路由和类级别路由前缀。但是,从某种配置(可能是代码)中,我想为所有属性路由添加另一个前缀。我不想创建自定义路由属性以在我的代码库中使用,只是内置的。

这可能吗?

简单地说,我想走我的路线 /a/1/b/2 和 /x/3/y/2/z/1 并将它们转换为(尽管它不一定需要是 /api 前缀) /api/1/b/2 和 /api/x/3/y/2/z/1

【问题讨论】:

  • 一种方法是创建一个自定义路由处理程序(搜索 IRouteHandler)
  • 开销更大,但另一种选择是在您的服务器中进行配置。假设 IIS,您可以使用虚拟目录/应用程序,甚至可以使用 nginx 之类的东西修改路由。不确定这是否是一个选项,但为了完整起见提及它。
  • 我将不得不看看使用自定义路由处理程序。以前从来没有调查过。如果它可以用作一种横切关注点,只需替换或扩展请求管道中的现有关注点,那么这可能是一个非常优雅的解决方案。

标签: c# asp.net asp.net-web-api


【解决方案1】:

选项 1

您可以创建一个所有其他控制器都继承自的抽象基控制器类,并将RoutePrefix 属性应用于该类。例如:

[RoutePrefix("/api")
public abstract class BaseController : ApiController
{
}

然后我的普通控制器将如下所示:

public class ValuesController : BaseController
{
    [Route("/get/value")]
    public string GetValue()
    {
        return "hello";
    }
}

选项 2

第二个选项是使用reverse proxy,它将所有传入请求透明地路由到正确的 URL。您可以使用重写规则设置代理,例如“任何匹配/api/* 的请求,重定向到internalserver/*”。您可以使用 IIS 的 ARR 来执行此操作,它是免费的。我过去使用过它,它在这种情况下效果很好。

【讨论】:

  • 这也是我想避免的。我希望我的代码库不知道它是带有前缀的路由路径。
  • 如果您希望它完全在您的应用之外,那么您可以使用反向代理服务器来重写传入的请求。
  • 例如,使用ARR,您可以让IIS 将/api/* 重写为/*,而您的应用甚至都不知道它。
【解决方案2】:

您还可以读取默认 HttpConfiguration 的 Routes 并创建一个新的 HttpConfiguration,唯一的区别是您将前缀应用于 routeTemplate。最后你使用这个HttpConfiguration。

理论上,您还可以创建一个新的 WebApi Startup 类,并且您的旧类提供它的 HttpConfiguration 作为属性,以防您想在单独的 Web 项目中更改路由。

类似:

HttpConfiguration oldCofiguration = OtherWebService.Startup.Config;
HttpConfiguration newCofiguration = new HttpConfiguration();
foreach(var oldRoute in oldCofiguration.Routes){
    newCofigurationRoutes.MapHttpRoute(
            "YourRouteName",
            "yourPrefix" + oldRoute .routeTemplate ,
            new
            {
                controller = oldRoute.Controller
            },
            null,
            null
            );
}

您需要根据需要调整代码。 (抱歉代码未经测试,因为我现在无法访问IDE)

【讨论】: