2015-05-08 90 views
1

在我的项目中,我有2个版本的API。从这个Post我知道一个自定义控件选择器需要编写,因此它得到不同的版本(因为webapi查找控制器名称匹配并忽略它们所在的名称空间)。web api 2版本和路由属性路由

这一切工作正常,我可以打电话到不同的版本。

但是,我也利用web api 2的新数据属性路由,并且在使用这个时,客户控制选择器不能正确处理路由。

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

(该V01版本之间是不同的,因此它可以是V02)

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

这可以在端包含一些额外的查询字符串PARAMS以及

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

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

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

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

我会调查,所以如果我找到一些我会在这里更新,但如果你有什么请让我知道。

感谢

马克

回答

2

有点挖后,我已经发现,路由属性通过不同的路径去。

因此,要处理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 
} 

干杯 马克