C# 具有相同routeTemplate且具有版本约束的WebApi路由

C# 具有相同routeTemplate且具有版本约束的WebApi路由,c#,asp.net-web-api,asp.net-mvc-routing,C#,Asp.net Web Api,Asp.net Mvc Routing,我正在使用WebAPI构建一个api。我的目标是为每个版本的API创建一个外部库,WebAPI应用程序在WebApiConfig 示例:Api.v1和Api.v2 它们将共享类似的功能,但根据标题中传递的版本,它将选择适当的API版本: /{controller}/{action}-HTTP-HEADER:version=1映射到Api.v1.controller/action /{controller}/{action}-HTTP-HEADER:version=2映射到Api.v2.cont

我正在使用WebAPI构建一个api。我的目标是为每个版本的API创建一个外部库,WebAPI应用程序在
WebApiConfig

示例:
Api.v1
Api.v2


它们将共享类似的功能,但根据标题中传递的
版本
,它将选择适当的API版本:

/{controller}/{action}
-
HTTP-HEADER:version=1
映射到
Api.v1.controller/action

/{controller}/{action}
-
HTTP-HEADER:version=2
映射到
Api.v2.controller/action


目标是避免在
/{ver}/{controller}/{action}
前面加前缀。我知道不支持使用相同值的
routeTemplates
,但我认为可以将路由绑定到特定名称空间,约束可能有助于解决匹配的问题:

namespace Api.v1
{
    public static class Routing
    {
        public static void MapRoutes(HttpConfiguration config)
        {
            IHttpRoute r = config.Routes.MapHttpRoute(
                name: "",
                routeTemplate: "{controller}/{action}/{id}",
                defaults: new 
                {
                    id = RouteParameter.Optional, 
                    namespaces = new string[] { "Api.v1.Controllers" } 
                },
                constraints: new VersionConstraint(2)
            );
        }
    }
}

尝试为每个路由注入
名称空间
,也没有真正的帮助。
DataTokens
属性为null且为只读


知道我在做什么吗?有没有办法将相同的路由映射到具有相同名称但具有不同功能和命名空间的不同控制器?

看看,这似乎回答了您关于如何基于HTTP头的顺序进行路由的问题


您可以将默认控制器选择器替换为根据HTTP头选择正确控制器的自定义选择器。

ASP.NET Web API:使用名称空间来设置Web API的版本。

嗯。。。我不知道为什么我的搜索中没有出现这一点,这正是我想要的。使用Web API v2中的新属性routing,您也可以使用基于URL的路由,只需在RoutePrefix属性中引入版本(对于整个控制器)或者在操作级别,使用Route attributeThat仅为控制器中方法的所有路由加前缀。IHttpControllerSelector的默认实现不会区分具有相同类名的两个控制器(当然它们位于不同的命名空间中)。您仍然需要自定义IHttpControllerSelector实现。您好!我已经通过Header使用了web api版本。我的问题是,我们如何在Swagger UI中对其进行分离或分组?我使用的是NetFramework4.7。请你的人帮忙
public class VersionConstraint : IRouteConstraint
{
    int _version;
    public VersionConstraint(int version)
    {
        _version = version;
    }

    public bool Match(
        HttpContextBase httpContext, 
        Route route, 
        string parameterName, 
        RouteValueDictionary values, 
        RouteDirection routeDirection)
    {
        int version;
        int.TryParse(httpContext.Request.Headers["version"], out version);
        return version == _version;
    }
}