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

ASP.NET API版本控制

发布时间:2020-12-16 00:15:07 所属栏目:asp.Net 来源:网络整理
导读:我是ASP.NET的新手,但我希望为即将开始的新API实现一些版本控制. 我甚至不确定我正在寻找什么是可能的,但我正在使用一个非常干净的版本方法使用头变量. 理想情况下,我希望能够在代码结构中包含一个版本文件夹,并在其中包含不同的API版本. 每个版本文件夹都包
我是ASP.NET的新手,但我希望为即将开始的新API实现一些版本控制.

我甚至不确定我正在寻找什么是可能的,但我正在使用一个非常干净的版本方法使用头变量.

理想情况下,我希望能够在代码结构中包含一个版本文件夹,并在其中包含不同的API版本.
每个版本文件夹都包含核心API代码的完整副本,所以我知道永远不会有任何冲突等.我知道这会使代码膨胀,但是值得保持它非常干净并且只会超过2-3 API的版本有效.

我在Internet上发现了许多标题样本,但它们都要求类在不同的名称空间中,如果我正在完成代码的复制,那么每次复制时都必须重命名所有类.

我正在尝试做什么?或者在处理多个类时是否有更清洁的解决方案?

解决方法

RESTful方式版本有四种基本方法 –

> URI路径此方法采用以下形式:

http://api/v2/Tasks/ {}的taskid
> URI参数此方法采用以下形式:

http://api/Tasks/ {的TaskID}?V = 2
>内容协商这是在HTTP标头中完成的.

内容类型:application / vnd.taskManagerApp.v2.param.json
>请求标头这也是在HTTP标头中完成的.

x-taskManagerApp-version:2

我个人喜欢第一种方法.你可以阅读Mike Wasson’s ASP.NET Web API: Using Namespaces to Version Web APIs.

许多人修改了Mike Wasson的原始资源.我喜欢ASP.NET Web API 2 book by Jamie Kurtz,Brian Wortman中使用的那个.

由于它有太多移动件,我创建了a sample project at GitHub.

config.Routes.MapHttpRoute(
   name: "DefaultApi",routeTemplate: "api/{version}/{controller}",defaults: new { version = "v2" }
);

config.Routes.MapHttpRoute(
   name: "DefaultApiWithId",routeTemplate: "api/{version}/{controller}/{id}",defaults: new { id = RouteParameter.Optional }
);

然后,添加ApiVersionConstraint

public class ApiVersionConstraint : IHttpRouteConstraint
{
    public ApiVersionConstraint(string allowedVersion)
    {
        AllowedVersion = allowedVersion.ToLowerInvariant();
    }

    public string AllowedVersion { get; private set; }

    public bool Match(HttpRequestMessage request,IHttpRoute route,string parameterName,IDictionary<string,object> values,HttpRouteDirection routeDirection)
    {
        object value;
        if (values.TryGetValue(parameterName,out value) && value != null)
        {
            return AllowedVersion.Equals(value.ToString().ToLowerInvariant());
        }
        return false;
    }
}

用法

您只需将RoutePrefix放在控制器上,就完成了.

[RoutePrefix("api/{apiVersion:apiVersionConstraint(v1)}/values")]
public class ValuesController : ApiController
{
    // GET api/v1/values
    [Route("")]
    public IEnumerable<string> Get()
    {
        return new string[] { "v1-value1","v1-value2" };
    }

    // GET api/v1/values/5
    [Route("{id}")]
    public string Get(int id)
    {
        return "v1-value-" + id;
    }
}

(编辑:李大同)

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

    推荐文章
      热点阅读