基本配置及说明

版本控制有助于及时推出功能,而不会破坏现有系统。 它还可以帮助为选定的客户提供额外的功能。 API版本可以通过不同的方式完成,例如在URL中添加版本或通过自定义标头和通过Accept-Header作为查询字符串参数。 在这篇文章中,我们来看看如何支持多版本的ASP.NET Core Web API

创建一个ASP.NET Core Web API应用程序。通过 NuGet 安装此软件包:Microsoft.AspNetCore.Mvc.Versioning,打开Startup.cs,修改ConfigureServices方法,代码如下:

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

你可以看到配置了3个不同的选项:

  • ReportAPIVersions :这是可选的。 但是当设置为true时,API会在响应头中返回受支持的版本信息。
  • AssumeDefaultVersionWhenUnspecified :此选项将用于在没有版本的情况下提供请求。 假定的API版本默认为1.0
  • DefaultApiVersion :此选项用于指定在请求中未指定任何版本时要使用的默认API版本。 这将默认版本为1.0

这就是配置和设置。 现在我们将看到访问API版本的不同方法。

Via Query String(通过查询字符串)

打开Controller 类,然后用ApiVersion属性装饰控Controller类。 像下面这样,

namespace MultipleAPIVersions.Controllers
{[ApiVersion("1.0")][Route("api/[controller]")]public class ValuesController : Controller{[HttpGet]public IActionResult Get() => Ok(new string[] { "value1" });}
}

以上版本被设置为1.0,你还可以设置API版本为2.0,为此你需要在不同命名空间中创建具有相同名称的另一个Controller类。 像下面这样,

namespace AspNetCoreWebApi.Controllers2
{[ApiVersion("2.0")][Route("api/[controller]")]public class ValuesController : Controller{[HttpGet]public IActionResult Get() => Ok(new string[] { "value2" });}
}

现在去浏览器并访问控制器。 您应该看到API版本1.0控制器的输出,因为默认访问为1.0的版本。 现在在URL中附加api-version = 2,你应该看到API 2.0版控制器的输出。

Via URL Path Segment(通过URL路径)

查询字符串参数是有用的,但在长URL和其他查询字符串参数的情况下可能会很痛苦。 相反,更好的方法是在URL路径中添加版本。 像这样,

  • api/v1/values
  • api/v2/values

所以要做到这一点,我们需要把版本放在route属性中:

namespace MultipleAPIVersions.Controllers
{[ApiVersion("1.0")][Route("api/v{version:apiVersion}/[controller]")]public class ValuesController : Controller{[HttpGet]public IActionResult Get() => Ok(new string[] { "value1" });}
}

同样,您需要将路由参数更新到所有请求中。 通过此更改,API端点始终需要具有版本号。 您可以通过api/v1/values导航到版本1.0,要想访问2.0版本,更改URL中的版本号。 简单,看起来更干净

Via HTTP Headers(通过HTTP头传递)

在上述两种方法中,需要修改URL以支持版本控制。 但是,如果您希望您的API URL保持干净,那么API版本信息也可以通过附加HTTP头传递。 为了使其工作,您需要配置ApiVersionReader选项

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

打开Postman添加header api-version测试

当您将2.0作为值提供给api-version时,它将调用2.0版Controller并返回输出

简单易用的设置。 但是,现在查询字符串参数(query string parameter)将无法正常工作。 设置header后,不能指定查询字符串参数(query string parameter)。 如果你希望支持,请使用ApiVersionReader.Combine

option.ApiVersionReader = ApiVersionReader.Combine(new QueryStringApiVersionReader("api-version"),new HeaderApiVersionReader("api-version"));

现在,查询字符串参数和header都支持
请记住,我们还将ReportApiVersions设置为true,返回响应头中的版本信息。 见下图

现在,让我们来看看另外几个选项

MapToApiVersion

MapToApiVersion 特性允许将单个API action 映射到任何版本。 换句话说,支持多个版本的单个Controller

namespace MultipleAPIVersions.Controllers
{[ApiVersion("1.0")][ApiVersion("3.0")][Route("api/v{version:apiVersion}/[controller]")]public class ValuesController : Controller{[HttpGet]public IActionResult Get() => Ok(new string[] { "value1" });[HttpGet, MapToApiVersion("3.0")]public IActionResult GetV3() => Ok(new string[] { "value3" });}
}

Deprecated(弃用)

当支持多个API版本时,一些版本最终将被淘汰。 要想标明一个或多个API版将被弃用,只需将准备弃用的API版本标记。 这并不意味着不支持API版本,这些被标记的API仍然可以调用。 这只是让用户意识到以后版本将被废弃的一种方式
[ApiVersion("1.0", Deprecated = true)]

ApiVersionNeutral(版本中立)

ApiVersionNeutral特性定义该API是版本中立的。 这对于行为方式完全相同的API非常有用,不论是支持API版本的Controller还是不支持API版本的Controller。 因此,你可以添加ApiVersionNeutral特性以退出版本控制

[ApiVersionNeutral]
[RoutePrefix( "api/[controller]" )]
public class SharedController : Controller
{[HttpGet]public IActionResult Get() => Ok();
}

访问版本信息

如果你想知道哪个版本的客户端正在尝试访问,那么你可以从中获取该信息:

public string Get() => HttpContext.GetRequestedApiVersion().ToString();

文章原地址 support-multiple-versions-of-asp-net-core-web-api
相关文章API-Version-Reader

转载于:https://www.cnblogs.com/MrNice/p/aspnet-core-api-version.html

支持多个版本的ASP.NET Core Web API相关推荐

  1. 如何测试ASP.NET Core Web API

    在本文中,我们将研究如何测试你的ASP .NET Core 2.0 Web API解决方案.我们将了解使用单元测试进行内部测试,使用全新的ASP .NET Core的集成测试框架来进行外部测试. 本文 ...

  2. 针对ASP.NET Core Web API的先进架构

    \ 本点要点 \\ 与传统的ASP.NET相比,ASP.NET Core的新架构提供了一些好处\\t ASP.NET Core从一开始就包含对依赖注入的支持\\t 单一职责原则简化了实施和设计.\\t ...

  3. 如何测试 ASP.NET Core Web API

    在本文中,我们将研究如何测试你的 ASP .NET Core 2.0 Web API 解决方案.我们将了解使用单元测试进行内部测试,使用全新的 ASP .NET Core 的集成测试框架来进行外部测试 ...

  4. ASP.NET Core 实战:使用ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目

    一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自 ...

  5. ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现

    在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现.接下来对于事件驱动型架构的讨论,就需 ...

  6. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行 ...

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

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

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

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

  9. 连接Android与ASP.NET Core Web API的完整教程

    目录 准备数据库 ASP.NET Core Web API项目 创建新的ASP.NET Core Web API项目 实体 导入EF Core 创建DbContext 将连接字符串添加到appsett ...

最新文章

  1. 图解数据库辅助软件教程
  2. [Project Euler] 来做欧拉项目练习题吧: 题目004
  3. CRM One order里user status和system status的mapping逻辑
  4. gm怎么刷东西 rust_Rust语言:解引用详述,搞不明白这个概念,趁早放弃Rust
  5. 奇怪的问题,再次启动jar包会导致bean对象失效?Unknown redis exception Cannot connect, Event executor group is terminated
  6. js array 删除指定元素_JS数组
  7. cobaltstrike之创建监听器与生成后门
  8. C#中索引超出了数组界限如何解决
  9. 漫游项目服务器,漫游Radius服务器的设计与实现
  10. eMMC mmcblk0boot0
  11. GoDEX条码打印机批量打印条码设置
  12. 为什么毕业一年了工资还是只有7K
  13. Hadoop安装准备
  14. 一个男人最高的品味就是他选择的女人
  15. 【qq机器人】Nonebot2搭建详细教程
  16. VCS中VPD的使用简单教程
  17. 运维监控系统PIGOSS BSM 如何实现IT巡检
  18. 一个游戏程序员的资料一(转)
  19. Macromedia Captivate
  20. 华为 1+X《网络系统建设与运维(中级)》认证 模拟实验上机试题及其答案全解析

热门文章

  1. Java 7在整数中出现的次数
  2. phpstudy php日志,phpstudy开启网站Apache日志并且按照日期划分创建
  3. 汽车之家全系车型(包含历史停售车型)图片--参数分析
  4. Count the Colors ZOJ - 1610
  5. [Swift]LeetCode835. 图像重叠 | Image Overlap
  6. linux:scp从入门到刚入门
  7. ibatis时间比较大小
  8. Delphi Form Designer (窗体设计器)之二
  9. 系统讲解——更好的实施专案(Porject)
  10. 如何用纯 CSS 创作一个摇摇晃晃的 loader