15

我試圖啓用REST API版本,其中在標題中指定的版本爲"api-version":2MVC6的VersionedRoute屬性實現

根據this tutorial我只需要創建

VersionConstraint : IHttpRouteConstraint

VersionedRoute: RouteFactoryAttribute

的用法是應用[VersionedRoute("api/controllerName", 2)]屬性給控制器,它是專爲特定版本(例如在這種情況下的版本2)。

這一切都很好,但不幸的是,這一切都在MVC5中,而我正在使用MVC6。因此,RouteFactoryAttributeIHttpRouteConstraint不起作用。

我設法找到IRouteConstraint來代替IHttpRouteConstraint(希望它會工作),但我找不到RouteFactoryAttribute的替代品。

如果任何人都可以使用MVC 6提供一個樣本,或者至少提到正確的類(理想情況下帶有名稱空間),我需要繼承?

+1

在這看看,看看它是否適合您的需要:https://github.com/aspnet/Mvc/blob/dev/test/WebSites/VersioningWebSite/VersionRoute.cs #L11 –

+0

謝謝,我已經看過那些代碼,看起來不必要的太多了。看看老例子,應該有一個更緊湊的方法來做到這一點。 –

+0

由於這是一個新的框架,因此可能不存在apis之間的一對一映射。當然你可以試試看看新的api是否有一個更簡單的方法。 –

回答

8

以下是您需要的最低工作量。

首先,去there和複製代碼爲3個以下文件:

一旦你有了這個,我們將改變GetVersionVersionRangeValidator的方法如下:

public static string GetVersion(HttpRequest request) 
{ 
    if (!string.IsNullOrWhiteSpace(request.Headers["api-version"])) 
     return request.Headers["api-version"]; 

    return "1"; 
} 

這將讀取標題並返回API版本。在這種情況下,默認值爲v1

下面是如何使用它的控制器(也可以是相同的控制器,具有2個操作:

[Route("api/data")] 
public class DataController 
{ 
    [VersionGet("", versionRange: "[1]")] 
    public string GetData() 
    { 
     return "v1 data"; 
    } 
} 

[Route("api/data")] 
public class DataV2Controller 
{ 
    [VersionGet("", versionRange: "[2]")] 
    public string GetData() 
    { 
     return "v2 data"; 
    } 
} 

所以,現在你只需要給它的右側頭和它的好此代碼已。與jQuery測試這樣的:

$(document).ready(function(){ 
    $.ajax({url: '/api/Data/', headers: { 'api-version': 1 }}) 
    .then(function(data){ 
      alert(data); 
      }); 
    $.ajax({url: '/api/Data/', headers: { 'api-version': 2 }}) 
    .then(function(data){ 
      alert(data); 
      }); 
}); 
+0

在您的示例中,您提到相同的控制器可以針對不同版本執行2個操作。我測試了它,它運行良好,但如果'''api-version'''不匹配任何,例如:'''api-version:3'',路由將找到一條模糊的路由,因爲有2個HttpGet操作具有相同的簽名,它會拋出一個錯誤:'AmbiguousActionException:匹配多個動作。以下動作匹配路線數據並且滿足所有約束。 關於如何處理該場景的任何建議?參數'''Order'''並沒有什麼區別來設置哪個動作是首選的。 Thx – iberodev

+0

您必須修改示例中給出的代碼,但對我而言,它將始終提供默認處理程序。我很遺憾沒有嘗試過這種情況,在2016年之前我無法給你一個答案。我目前沒有在這臺機器上安裝VS2015。 :( –

+0

如果我的答案與您的原始問題相符,請花時間將其標記爲已回答。:) –