加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – MVC6的VersionedRoute属性实现

发布时间:2020-12-15 23:50:38 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试在标头中指定版本的REST API上启用版本控制,如“api-version”:2. 根据this tutorial我只需要创建 VersionConstraint:IHttpRouteConstraint 和 VersionedRoute:RouteFactoryAttribute 用法是将[VersionedRoute(“api / controllerName”,2)]属
我正在尝试在标头中指定版本的REST API上启用版本控制,如“api-version”:2.

根据this tutorial我只需要创建

VersionConstraint:IHttpRouteConstraint

VersionedRoute:RouteFactoryAttribute

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

这一切都很好,但不幸的是,这一切都在MVC5中,我正在使用MVC6.因此,RouteFactoryAttribute和IHttpRouteConstraint不起作用.

我设法找到IRouteConstraint来替换IHttpRouteConstraint(希望它可以工作),但是我找不到RouteFactoryAttribute的替代.

如果有人可以使用MVC 6提供这个样本,或者至少提到正确的类(理想的命名空间),我需要继承?

解决方法

这是您需要的最低工作量.

首先,去there并复制3个以下文件的代码:

> VersionGetAttribute
> VersionRangeValidator
> VersionRoute.cs

一旦你有了这个,我们将改变VersionRangeValidator的GetVersion方法:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读