17

我正在尝试在 REST API 上启用版本控制,其中版本在标头中指定为"api-version":2.

根据本教程,我只需要创建

VersionConstraint : IHttpRouteConstraint

VersionedRoute: RouteFactoryAttribute

用法是将[VersionedRoute("api/controllerName", 2)]属性应用于为特定版本(例如本例中的版本 2)设计的控制器。

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

我设法找到IRouteConstraint了替换IHttpRouteConstraint(希望它会起作用),但我找不到RouteFactoryAttribute.

如果有人可以使用 MVC 6 提供此示例,或者至少提及我需要继承的正确类(理想情况下带有命名空间)?

4

1 回答 1

10

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

首先,去那里复制以下 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);
            });
});
于 2015-11-26T13:56:16.147 回答