通过微软的一个库Microsoft.AspNetCore.Mvc.Versioning实现asp.net core web api的版本控制。

以两种形式组织了Controller:

  • 文件夹分开
  • 命名不同但是路由是一样的

需要注意的是,Microsoft.AspNetCore.Mvc.Versioning版本必须是>=3.1.0,不然相同路由会出现以下这样的错误:

URL Path Segment

在 URL 路径中添加版本,类似这样:

/api/v1/product
/api/v2/product

怎么实现呢?

Startup下的ConfigureServices方法加如下的配置:

 public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddApiVersioning(option =>
{
option.ReportApiVersions = true;
option.AssumeDefaultVersionWhenUnspecified = true;
option.DefaultApiVersion = new ApiVersion(1, 0);
});
}

我们的Controller路由需要配置成如下,[ApiVersion("1.0")]控制访问当前的版本:

[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/product")]
[ApiController]
public class ProductV1Controller : ControllerBase
{
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "Huwei Phone V1", "Xiaomi Phone V1", "Vivo Phone V1" };
}
}

Startup的配置参数也要改一下:

 services.AddApiVersioning(option =>
{
option.ReportApiVersions = true;
option.ApiVersionReader = new QueryStringApiVersionReader("api-version");
option.AssumeDefaultVersionWhenUnspecified = true;
option.DefaultApiVersion = new ApiVersion(1, 0);
});

可以看到效果:

QueryString

通过url参数的方式也可以实现版本控制:

/api/production?api-version=1
/api/production?api-version=2

与上面不同的是controller只要用ApiVersion特性就够了,

[ApiVersion("1.0")]
[Route("api/[controller]")]
[ApiController]
public class ProductionController : ControllerBase
{
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new string[] { "Huwei Phone V1", "Xiaomi Phone V1", "Vivo Phone V1" };
}
}

Head

版本信息可以放在url的参数中,可以放在url路径中,也可放在请求的header里,这样显的接口干净利索感知不到版本的存在。

和使用QueryString的实现方式大体一样,只是在配置中不一样,Contrller无需改动:

services.AddApiVersioning(option =>
{
option.ReportApiVersions = true;
//option.ApiVersionReader = new QueryStringApiVersionReader("api-version");
option.ApiVersionReader = new HeaderApiVersionReader("api-version");
option.AssumeDefaultVersionWhenUnspecified = true;
option.DefaultApiVersion = new ApiVersion(1, 0);
});

三种实现方式对比

无论是什么配置都是支持Url Path Segement

根据option.ApiVersionReader参数的不同支持的会分别支持QueryStringHeader两种方式。

Microsoft.AspNetCore.Mvc.Versioning

各种特性的在不同场景的用法

ApiVersion

定义了当前Controller的版本,可以支持多个。

其中有个Deprecated参数:用于表示当前版本是否弃用的信息,当然接口还是可以正常调用的。

MapToApiVersion

如果一个Controller下有多个版本,有接口支持V1版本,有的接口支持V2版本,可以使用MapToApiVersion实现具体的哪个接口支持哪个版本调用,这个特性是打在具体的接口方法上的。

ApiVersionNeutral

如果你想一个Controller任意版本都可以调用,则可以加上该特性

参考

asp.net core web api 版本控控制的更多相关文章

  1. 支持多个版本的ASP.NET Core Web API

    基本配置及说明 版本控制有助于及时推出功能,而不会破坏现有系统. 它还可以帮助为选定的客户提供额外的功能. API版本可以通过不同的方式完成,例如在URL中添加版本或通过自定义标头和通过Accept- ...

  2. 或许是你应该了解的一些 ASP.NET Core Web API 使用小技巧

    一.前言 在目前的软件开发的潮流中,不管是前后端分离还是服务化改造,后端更多的是通过构建 API 接口服务从而为 web.app.desktop 等各种客户端提供业务支持,如何构建一个符合规范.容易理 ...

  3. ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...

  4. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  5. 在ASP.NET Core Web API上使用Swagger提供API文档

    我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...

  6. Docker容器环境下ASP.NET Core Web API应用程序的调试

    本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...

  7. 在docker中运行ASP.NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

  8. Docker容器环境下ASP.NET Core Web API

    Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...

  9. docker中运行ASP.NET Core Web API

    在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...

随机推荐

  1. 5 个免费的受欢迎的 SQLite 管理工具

    SQLite Expert – Personal Edition SQLite Expert 提供两个版本,分别是个人版和专业版.其中个人版是免费的,提供了大多数基本的管理功能. SQLite Exp ...

  2. Linux下安装mysql教程

    Linux下安装mysql  MySQL官网:https://dev.mysql.com/downloads/mysql/ 到mysql官网下载mysql编译好的二进制安装包,在下载页面Select ...

  3. E:\Postgresql\pgAdmin4_binaryPath

    e Path to the directory containing the EDB Advanced Server utility programs (pg_dump, pg_restore etc ...

  4. SQL element_at函数

    库里有类似josn形式的字符串数据attr{"a":"123","b":"234"."c":&quo ...

  5. Delphi IdHttp组件+IdHttpServer组件实现文件下载服务

     http://blog.csdn.net/xxkku521/article/details/16864759 Delphi IdHttp组件+IdHttpServer组件实现文件下载服务 2013- ...

  6. 配置最漂亮的PyCharm界面,Python程序员必备!

    高逼格超美的IDE界面,是每个程序员的梦想! 随着人工智能/机器学习的兴起,Python作为一门“漂亮的语言”,再次获得广大程序员的关注.而JetBrains出品的PyCharm无疑是最好用的Pyth ...

  7. ApplicationContextAware 快速获取bean

    在Web应用中,Spring容器通常采用声明式方式配置产生:开发者只要在web.xml中配置一个Listener,该Listener将会负责初始化Spring容器,MVC框架可以直接调用Spring容 ...

  8. scite配置文件及常用设置

    在linux系统中,SciTE的用户设置文件为 ~/.SciTEUser.properties,优先级高于全局配置文件. scite是个不错的IDE工具,只是本人发现,在开发团队中和其他成员的编辑工具 ...

  9. kvm 修改虚拟机密码

    kvm 修改虚拟机密码 现在虚拟机kvm的使用很流行,为了更多的差异化环境,每个人可能拥有很多的kvm,这数量一多难免会有image的密码会忘记,相信很多人会采用kernel single user ...

  10. PEP8规范总结

    PEP8规范总结 代码编排 1 缩进.4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格. 2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的 ...