C# 具有版本和路由属性的web api 2路由

C# 具有版本和路由属性的web api 2路由,c#,asp.net-mvc-5,asp.net-web-api2,asp.net-mvc-routing,C#,Asp.net Mvc 5,Asp.net Web Api2,Asp.net Mvc Routing,在我的项目中,我有两个版本的API。由此我了解到,自定义控件选择器需要编写以获得不同的版本(因为webapi查找控制器名称匹配并忽略它们所在的名称空间) 这一切工作正常,我可以调用不同的版本 然而,我也使用了来自web api 2的新数据属性路由,当使用此属性时,客户控制选择器无法正确处理路由 我使用的路由数据属性如下所示 (不同版本的V01不同,因此可以是V02) 这也可以在末尾包含一些额外的查询字符串参数 [Route("api/V01/user/readbyreference")] 这

在我的项目中,我有两个版本的API。由此我了解到,自定义控件选择器需要编写以获得不同的版本(因为webapi查找控制器名称匹配并忽略它们所在的名称空间)

这一切工作正常,我可以调用不同的版本

然而,我也使用了来自web api 2的新数据属性路由,当使用此属性时,客户控制选择器无法正确处理路由

我使用的路由数据属性如下所示

(不同版本的V01不同,因此可以是V02)

这也可以在末尾包含一些额外的查询字符串参数

[Route("api/V01/user/readbyreference")] 
这需要一个查询字符串
?id=EMAIL | EMAIL.domain.com

可以找到客户控制选择器的代码

我可以看出问题在于
GetRouteVariable
获取所需的名称空间部分和控制器,但我想知道是否有其他人必须这样做,以及他们是否有办法解决这个问题

我会调查的,所以如果我发现什么,我会在这里更新,但如果你有什么,请让我知道

谢谢


标记

经过一番挖掘,我发现属性路由通过不同的路径

因此,要在
GetRouteVariable
中处理属性路由,您需要获取
MS_子例程
值,然后对结果执行所需的操作以获得名称空间和控制器。 下面需要整理一下,但它至少让您了解了如何在自定义控件选择器中处理数据属性路由

var子例程=(IEnumerable)路由数据值[“MS_子例程”];
var routeBreakDown=subroutes.First().Route.RouteTemplate.Split('/');
如果(名称==“命名空间”)
{
return(T)(object)routeBreakDown[1];//名称空间
}
else if(名称==“控制器”)
{
返回(T)(对象)路由故障[2];//控制器
}
干杯 标记

[Route("api/V01/user/readbyreference")] 
var subroutes = (IEnumerable<IHttpRouteData>)routeData.Values["MS_SubRoutes"];
var routeBreakDown= subroutes.First().Route.RouteTemplate.Split('/');
if (name == "namespace")
{
    return (T)(object)routeBreakDown[1]; //namespace
}
else if (name == "controller")
{
    return (T)(object)routeBreakDown[2]; //controller
}