Dot-Net

MVC6 的 VersionedRoute 屬性實現

  • November 26, 2015

我正在嘗試在 REST API 上啟用版本控制,其中版本在標頭中指定為"api-version":2.

根據本教程,我只需要創建

VersionConstraint : IHttpRouteConstraint

VersionedRoute: RouteFactoryAttribute

用法是將[VersionedRoute("api/controllerName", 2)]屬性應用於為特定版本(例如本例中的版本 2)設計的控制器。

這一切都很好,但不幸的是,這一切都在 MVC5 中,而我正在使用 MVC6。因此,RouteFactoryAttribute並且IHttpRouteConstraint不工作。

我設法找到IRouteConstraint了替換IHttpRouteConstraint(希望它會起作用),但我找不到RouteFactoryAttribute.

如果有人可以使用 MVC 6 提供此範例,或者至少提及我需要繼承的正確類(理想情況下帶有命名空間)?

這是您需要的最少工作量。

首先,去那裡複製以下 3 個文件的程式碼:

一旦你有了這個,我們將改變以下的GetVersion方法VersionRangeValidator

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);
           });
});

引用自:https://stackoverflow.com/questions/32892557