2012-12-21 113 views
9

我有一個ASP.NET MVC 4應用程序。我想使用新的Web API功能進行學習。我想學習如何公開相同的端點,但提供不同的版本。換句話說,我要揭露端點如下所示:版本控制ASP.NET MVC中的Web API操作4

http://mysite/1.0/Products/1 
http://mysite/2.0/Products/1 

在試圖做到這一點,我默認的「控制器」目錄中增加了一個「API」目錄。在「Api」目錄中,我有兩個其他目錄:「Version1-0」和「Version2-0」。每個目錄都有一個名爲「ProductsController」的ApiController。

我試圖在我的WebApiConfig.cs文件中添加下列路線定義,露出端點:

config.Routes.MapHttpRoute(
    name: "1-0Api", 
    routeTemplate: "api/1.0/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

不幸的是,我無法弄清楚如何公開通過我上面列出的網址行動。我究竟做錯了什麼?謝謝!

回答

7

您可能遇到問題,因爲控制器具有相同的名稱。控制器名稱空間或其所在的文件夾對WebAPI完全無關緊要,只有名稱可以。我能想到的最簡單的事情是重命名你的控制器ProductsV1Controller和ProductsV2Controller並設置兩條路線指向您的控制器:

config.Routes.MapHttpRoute(
    name: "1-0Api", 
    routeTemplate: "api/1.0/Products/{id}", 
    defaults: new { controller = "ProductsV1", id = RouteParameter.Optional } 
); 
config.Routes.MapHttpRoute(
    name: "2-0Api", 
    routeTemplate: "api/2.0/Products/{id}", 
    defaults: new { controller = "ProductsV2", id = RouteParameter.Optional } 
); 

當然,這就會變得混亂,如果你有多個控制器要在此揭露辦法。讓我看看我能不能爲你想更好的事情。

+0

目前,我只有1個控制器(ProductsV1Controller),並且我無法訪問該端點。我究竟做錯了什麼?項目沒有其他改變。我從字面上開始了一個新的ASP.NET MVC 4項目,並希望添加一個版本控制器。 –

+0

有幾件事可能是錯的。你的控制器可能不是公共類,控制器可能不是從ApiController派生的,或其他的。你從本地機器上的服務器迴應什麼? –

+0

我的控制器是公開課。控制器確實從ApiContoller派生。在我的本地機器上,我收到了404。這是最奇怪的事情。 –

1

任何機會,你仍然有默認的Web API路由定義,它的之前您的自定義路由?這會導致你的方案失敗。以下路由定義(請注意訂單)適用於我。

public static void Register(HttpConfiguration config) { 
    config.Routes.MapHttpRoute(
     name: "1-0Api", 
     routeTemplate: "api/1.0/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 

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

Sebastiaan達曼已經,在他的博客,講述了他是如何寫的IHttpControllerSelector自己的實施和支持接口做網頁API版本。

http://damsteen.nl/blog/implementing-versioning-in-asp.net-web-api

他也把代碼在GitHub上

https://github.com/Sebazzz/SDammann.WebApi.Versioning

和包裝它的NuGet我們! :)

https://nuget.org/packages/SDammann.WebApi.Versioning

在實施IHttpControllerSelector肯定是(恕我直言)以正確的方式做的Web API版本, 我想如果他包括基於HTTP的能力,版本,它是理想的 Accept(見http://barelyenough.org/blog/2008/05/versioning-rest-web-services/)。

不幸的是我的客戶端無法使用Accept標題,所以他的RouteVersionedControllerSelector對我來說非常適合。

編輯:不知道我怎麼錯過了,但的確存在AcceptHeaderVersionedControllerSelector可以用來做版本的理想方式。我目前使用它的一個新的項目,但它仍然有some drawbacks

0

如果我們將您的第一個方法則有助於路線,並允許我們得到V1,V2數據....但是現在我們已經採取了一個控制器,以便路由代碼的V1的例子,V2將是如下:

config.Routes.MapHttpRoute(
    name: "1-0Api", 
    routeTemplate: "tables/v1/Products", 
    defaults: new { controller = "ProductsV1", id = RouteParameter.Optional } 
); 
config.Routes.MapHttpRoute(
    name: "2-0Api", 
    routeTemplate: "tables/v2/Products", 
    defaults: new { controller = "ProductsV2", id = RouteParameter.Optional } 
); 

但是我們有20多個控制器和多個版本,那麼如何使它成爲通用的。