在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

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

选项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)