C# 向webapi 2.2中的所有属性路由添加任意路由前缀

C# 向webapi 2.2中的所有属性路由添加任意路由前缀,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,这有点像是被问到的 我已经在使用属性路由和类级路由前缀了。但是,从某种类型的配置(可能是代码)中,我想为所有属性路由添加另一个前缀。我不想创建在整个代码库中使用的自定义路由属性,只想创建内置属性 这可能吗 简单地说,我想走我的路线 /a/1/b/2 和 /x/3/y/2/z/1 并将它们交给(尽管不一定需要是/api前缀) /api/1/b/2 和 /api/x/3/y/2/z/1选项1 您可以创建一个所有其他控制器都继承自的抽象基本控制器类,并将RoutePrefix属性应用于该类。例如: [

这有点像是被问到的

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

这可能吗

简单地说,我想走我的路线 /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的URL。您可以使用重写规则设置代理,例如“任何与
/api/*
匹配的请求,重定向到
internalserver/*
”。您可以使用IIS来执行此操作,并且它是免费的。我在过去使用过它,它在这种情况下工作得非常好。

您也可以读取默认HttpConfiguration的路由,然后创建一个新的HttpConfiguration,唯一的区别是将前缀应用于routeTemplate。最后,您将使用这个HttpConfiguration

从理论上讲,您还可以创建一个新的WebApi启动类,旧的类提供它的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的权限)

一种方法是创建一个定制路由处理程序(search-IRouteHandler),开销稍大一些,但另一种方法是在服务器中进行配置。假设使用IIS,您可以使用虚拟目录/应用程序,甚至可以使用nginx之类的工具修改路由。不确定这是否是一个选项,但出于完整性考虑,请提及它。我将不得不考虑使用自定义路由处理程序。以前从未调查过。如果它可以通过替换或扩展请求管道中现有的一个来作为一种交叉关注点,那么这可能是一个非常优雅的解决方案。这也是我想要避免的。我希望我的代码库不知道它正在使用前缀路由路径。如果你希望它完全在你的应用程序之外,那么你可以使用反向代理服务器重写传入的请求。例如,使用反向代理服务器,你可以让IIS将
/api/*
重写为
/*
,而你的应用程序甚至不知道它。