MVC6的VersionedRoute属性实现

时间:2015-10-01 16:32:35

标签: .net asp.net-web-api asp.net-core asp.net-core-mvc api-versioning

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

根据this tutorial,我只需要创建

VersionConstraint : IHttpRouteConstraint

VersionedRoute: RouteFactoryAttribute

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

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

我设法找到IRouteConstraint来替换IHttpRouteConstraint(希望它可以使用),但我找不到RouteFactoryAttribute的替代品。

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

1 个答案:

答案 0 :(得分:8)

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

首先,转到there并复制以下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);
            });
});