在Web api 2.2中为所有属性路由添加任意路由前缀

时间:2014-10-13 19:35:12

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

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

2 个答案:

答案 0 :(得分:2)

选项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/*"。您可以使用ARR为IIS执行此操作,它是免费的。我过去曾经使用它,对于这样的情况它非常适用。

答案 1 :(得分:0)

您还可以阅读默认HttpConfiguration的路由,并创建一个新的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)

相关问题