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

web api 2 routing with version and route attributes

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

一切正常,我可以调用不同的版本。

但是,我还利用了来自 Web api 2 的新数据属性路由,并且在使用它时,客户控件选择器无法正确处理路由。

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

(V01版本不同所以可以是V02)

[Route("api/v01/enumeration/{type}/{subtype}")]

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

[Route("api/V01/user/readbyreference")] 

这需要一个查询字符串 ?id=EMAIL|email.domain.com

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

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

我会调查,如果我发现了什么,我会在这里更新,但如果你有什么,请告诉我。

谢谢

马克

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

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

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
}

干杯 马克