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
答案 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)