2015-05-08 95 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 
} 

乾杯 馬克