基本配置及说明

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

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

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddMvc();
  4. services.AddApiVersioning(option =>
  5. {
  6. option.ReportApiVersions = true;
  7. option.AssumeDefaultVersionWhenUnspecified = true;
  8. option.DefaultApiVersion = new ApiVersion(1, 0);
  9. });
  10. }

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

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

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

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

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

  1. namespace MultipleAPIVersions.Controllers
  2. {
  3. [ApiVersion("1.0")]
  4. [Route("api/[controller]")]
  5. public class ValuesController : Controller
  6. {
  7. [HttpGet]
  8. public IActionResult Get() => Ok(new string[] { "value1" });
  9. }
  10. }

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

  1. namespace AspNetCoreWebApi.Controllers2
  2. {
  3. [ApiVersion("2.0")]
  4. [Route("api/[controller]")]
  5. public class ValuesController : Controller
  6. {
  7. [HttpGet]
  8. public IActionResult Get() => Ok(new string[] { "value2" });
  9. }
  10. }

现在去浏览器并访问控制器。 您应该看到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属性中:

  1. namespace MultipleAPIVersions.Controllers
  2. {
  3. [ApiVersion("1.0")]
  4. [Route("api/v{version:apiVersion}/[controller]")]
  5. public class ValuesController : Controller
  6. {
  7. [HttpGet]
  8. public IActionResult Get() => Ok(new string[] { "value1" });
  9. }
  10. }

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

Via HTTP Headers(通过HTTP头传递)

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

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

打开Postman添加header api-version测试

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

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

  1. option.ApiVersionReader = ApiVersionReader.Combine
  2. (
  3. new QueryStringApiVersionReader("api-version"),
  4. new HeaderApiVersionReader("api-version")
  5. );

现在,查询字符串参数和header都支持

请记住,我们还将ReportApiVersions设置为true,返回响应头中的版本信息。 见下图

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

MapToApiVersion

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

  1. namespace MultipleAPIVersions.Controllers
  2. {
  3. [ApiVersion("1.0")]
  4. [ApiVersion("3.0")]
  5. [Route("api/v{version:apiVersion}/[controller]")]
  6. public class ValuesController : Controller
  7. {
  8. [HttpGet]
  9. public IActionResult Get() => Ok(new string[] { "value1" });
  10. [HttpGet, MapToApiVersion("3.0")]
  11. public IActionResult GetV3() => Ok(new string[] { "value3" });
  12. }
  13. }

Deprecated(弃用)

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

[ApiVersion("1.0", Deprecated = true)]

ApiVersionNeutral(版本中立)

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

  1. [ApiVersionNeutral]
  2. [RoutePrefix( "api/[controller]" )]
  3. public class SharedController : Controller
  4. {
  5. [HttpGet]
  6. public IActionResult Get() => Ok();
  7. }

访问版本信息

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

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

文章原地址 support-multiple-versions-of-asp-net-core-web-api

相关文章API-Version-Reader

支持多个版本的ASP.NET Core Web API的更多相关文章

  1. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

    HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...

  2. asp.net core web api 版本控控制

    通过微软的一个库Microsoft.AspNetCore.Mvc.Versioning实现asp.net core web api的版本控制. 以两种形式组织了Controller: 文件夹分开 命名 ...

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

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

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

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

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

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

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

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

  7. Gitlab CI 自动部署 asp.net core web api 到Docker容器

    为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成. ...

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

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...

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

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

随机推荐

  1. Gradle入门学习---认识buildeTypes和dependencies

    Gradle是Android Studio默认的构建工具,如果是基本的APP开发,不会涉及到Gradle太多内容,毕竟它的诞生就不是专为Android服务的. 日常开发需要涉及到使用Gradle的场景 ...

  2. jQuery Ajax使用FormData上传文件和其他数据,后端web.py获取

    参考博文: 通过jQuery Ajax使用FormData对象上传文件 方法一:使用<form>表单初始化FormData对象方式上传文件 前端(JQuery): <form enc ...

  3. twemproxy发送流程探索——剖析twemproxy代码正编

    本文想要完成对twemproxy发送流程--msg_send的探索,对于twemproxy发送流程的数据结构已经在<twemproxy接收流程探索--剖析twemproxy代码正编>介绍过 ...

  4. Spring学习(6)---Bean定义及作用域的例子

    (一)Bean的定义 先定义一个BeanAnnotation package com.mypackage; import org.springframework.stereotype.Componen ...

  5. 一致性Hash算法与代码实现

    一致性Hash算法: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值 ...

  6. 【麦克风阵列增强】Delay and sum beamforming

    作者:桂. 时间:2017-06-03  15:40:33 链接:http://www.cnblogs.com/xingshansi/p/6937576.html 前言 本文主要记录麦克风阵列的几个基 ...

  7. .NET和JAVA 反射对比

    反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等程序集内部的信息.使用反射可以看到一个程序集内部的接口.类.方法.字段.属性.特性等等信息.在System.Reflectio ...

  8. Web设计思想——渐进增强

    最近在拜读一本Web体验相关的书<渐进增强--跨平台用户体验设计 >,阅读后做些总结,消化一下书中的精髓. 在阅读本文前,可以先思考下面几个问题. 1. 浏览网页的目的是什么? 2. 浏览 ...

  9. Realm的一对多配置以及版本兼容

    前言:本篇博客将介绍Realm的一些高级用法,基本使用在这里 一.配置一对多关系 // // Teacher.h #import <Realm/Realm.h> #import " ...

  10. Java IO学习笔记一

    Java IO学习笔记一 File File是文件和目录路径名的抽象表示形式,总的来说就是java创建删除文件目录的一个类库,但是作用不仅仅于此,详细见官方文档 构造函数 File(File pare ...