asp.net core web api 版本控控制
通过微软的一个库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
参数的不同支持的会分别支持QueryString
和Header
两种方式。
Microsoft.AspNetCore.Mvc.Versioning
各种特性的在不同场景的用法
ApiVersion
定义了当前Controller
的版本,可以支持多个。
其中有个Deprecated
参数:用于表示当前版本是否弃用的信息,当然接口还是可以正常调用的。
MapToApiVersion
如果一个Controller
下有多个版本,有接口支持V1版本,有的接口支持V2版本,可以使用MapToApiVersion
实现具体的哪个接口支持哪个版本调用,这个特性是打在具体的接口方法上的。
ApiVersionNeutral
如果你想一个Controller
任意版本都可以调用,则可以加上该特性
参考
asp.net core web api 版本控控制的更多相关文章
- 支持多个版本的ASP.NET Core Web API
基本配置及说明 版本控制有助于及时推出功能,而不会破坏现有系统. 它还可以帮助为选定的客户提供额外的功能. API版本可以通过不同的方式完成,例如在URL中添加版本或通过自定义标头和通过Accept- ...
- 或许是你应该了解的一些 ASP.NET Core Web API 使用小技巧
一.前言 在目前的软件开发的潮流中,不管是前后端分离还是服务化改造,后端更多的是通过构建 API 接口服务从而为 web.app.desktop 等各种客户端提供业务支持,如何构建一个符合规范.容易理 ...
- ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...
- 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...
- 在ASP.NET Core Web API上使用Swagger提供API文档
我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的API文档功能.当设置IISExpress的默认启动路由到Swagger的API文档页 ...
- Docker容器环境下ASP.NET Core Web API应用程序的调试
本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...
- 在docker中运行ASP.NET Core Web API应用程序
本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...
- Docker容器环境下ASP.NET Core Web API
Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Dock ...
- docker中运行ASP.NET Core Web API
在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...
随机推荐
- ORACLE数据库 memory_target SGA 大小
修改 memory_target 用oracle用户登录,sqlplus "/as sysdba"SQL> show parameters target; show ...
- 一个最最简单的 log4j 的 入门级使用案例
看了比较多的文档和博客,感觉这篇博客写得比较好,比较容易懂,先 mark 一下,回头做一个记录. 文章1:http://www.cnblogs.com/rushoooooo/archive/2011/ ...
- wl
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...
- 如何查看MySQL数据库的版本
如何查看MySQL数据库的版本 一.总结 一句话总结: SQL语句:select version(); 命令行:mysql -V 或 mysql --version 二.三种方法查看MySQL数据库的 ...
- .Net-WCF-图书:《WCF编程》
ylbtech-.Net-WCF-图书:<WCF编程> <WCF编程>是2008年1月机械工业出版社出版的图书,作者是Juval Lowy.Clemens Vasters. 1 ...
- day46----JavaScript的函数及对象小结
一:函数 01:普通函数 function f1(){ console.log("Helleo world") } f1(); //调用函数 -->Helleo world ...
- groub by 与 over partition by 的区别
这个逻辑,写的很对.明白了这个意思. over partition by 前面一定要用汇总函数.groub by 就可以不用.本质都是汇总 SELECT a.* ,SUM(a.audit_status ...
- oracle函数与存储方法
oracle中的函数, 可以理解为java中的方法 有参数, 或者没有参数 通过return返回一个值 oracle存储过程跟函数唯一的区别, 存储过程不能通过return返回一个值 参数的类型, i ...
- [Linux] 021 RPM 包的安装、升级与卸载
1. 包全名与包名包全名 包全名:操作的包是没有安装的软件包 使用包全名.而且要注意路径包名 包名:操作已经安装的软件包时,使用 是搜索 /var/lib/rpm/ 中的数 2. 安装 $ rpm - ...
- Linux-第一篇linux基本认识
1.在Linux世界中,一切皆是文件,Linux文件采用级层式的树状目录结构,在此结构中根目录是“/”. 一般linux系统的目录结构如下 目录结构说明 目录 说明 bin 存放二进制可执行文件(ls ...