MVC6的VersionedRoute属性实现

比洛伊

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

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

VersionConstraint : IHttpRouteConstraint

VersionedRoute: RouteFactoryAttribute

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

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

我设法找到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在这种情况下。

这是在控制器上使用它的方法(或者它可以是具有两个操作的相同控制器:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章