2014-04-24 21 views
2

我想在WEB API中使用AttributeRouting實現版本控制。我已經在控制器下定義了兩個名爲v1和v2的文件夾。我在每個文件夾中有多個控制器。在產品控制器I定義使用ASP.net WEB API中的屬性路由進行版本控制

RoutePrefix爲[RoutePrefix( 「V1 /產品」)]和[RoutePrefix( 「V2 /產品」)]

當我去到URI V1 /產品能正常工作但是v2/product也會執行v1文件夾中的代碼。屬性路由是否支持版本控制,或者是否還需要執行與路由相關的內容。我的路線定義爲

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "{namespace}/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional} 
     ); 

我的產品控制器看起來像

namespace API.Controllers 
{ 

[RoutePrefix("v1/product")] 

public class Productv1Controller : ApiController 

{ 

    private DBContext db = new DBContext(); 


    public dynamic Get() 
    { 
     //Gets the Products 
    } 
} 

在V2產品的代碼是

namespace API.Controllers 
{ 

[RoutePrefix("v2/product")] 

public class Productv2Controller : ApiController 

{ 

    private DBContext db = new DBContext(); 


    public dynamic Get() 
    { 
     //Gets the Products 
    } 
} 

是否有人可以建議或提供一個鏈接到一個例子來使用屬性路由實現版本控制

回答

4

您需要用路線修飾動作屬性才能使其工作。

[Route] public dynamic Get() ...

此外,你需要有config.MapHttpAttributeRoutes();在WebApiConfig的註冊方法

更新

下面是要點的鏈接,我在一個新的Web應用程序使用的WebAPI 5測試這它的工作。 https://gist.github.com/DavidDeSloovere/11367286

+0

我在GET方法中添加了[Route(「v1/product」)]和[Route(「v2/product」)],但它仍然不起作用。無論ROUTE中指定的路徑如何,它總是會進入/ v1/product。 – user2515186

+0

您不應在Route屬性中重複RoutePrefix屬性的前綴。如果你想覆蓋前綴,那麼你可以做一些像[Route(「〜v0/product」)] –

+0

感謝您的要求!我想知道控制器類名稱中的數字匹配是如何工作的。 – Zero3