在webapi 2.2中为所有属性路由添加任意路由前缀
本文关键字:路由 前缀 添加 任意 属性 webapi | 更新日期: 2023-09-27 18:26:26
这是在Web Api 2上被问及路由属性的全局路由前缀?。
我已经在使用属性路由和类级路由前缀了。然而,从某种配置(可能是代码)来看,我想为所有属性路由添加另一个前缀。我不想创建在整个代码库中使用的自定义路由属性,只想创建内置的路由属性。
这可能吗?
简单地说,我想走我的路线/a/1/b/2和/x/3/y/2/z/1并将它们转换为(尽管不一定需要是/api前缀)/api/1/b/2和/api/x/3/y/2/z/1
选项1
您可以创建一个所有其他控制器都继承的抽象基本控制器类,并将RoutePrefix
属性应用于该类。例如:
[RoutePrefix("/api")
public abstract class BaseController : ApiController
{
}
然后我的普通控制器会是这样的:
public class ValuesController : BaseController
{
[Route("/get/value")]
public string GetValue()
{
return "hello";
}
}
选项2
第二种选择是使用反向代理,它将透明地将所有传入请求路由到正确的URL。您可以使用重写规则设置代理,例如"任何与/api/*
匹配的请求,重定向到internalserver/*
"。您可以使用ARR for IIS来完成此操作,并且它是免费的。我过去用过它,它在这种情况下效果很好。
您还可以读取默认HttpConfiguration的Routes,只需创建一个新的HttpConfiguration,唯一的区别是将前缀应用到routeTemplate。最后使用这个HttpConfiguration。
理论上,你也可以创建一个新的WebApi Startup类,如果你想在一个单独的web项目中更改路由,你的旧类会提供它的HttpConfiguration作为属性。
类似于:
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)