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

基本配置及说明

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

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

[源码] view plain

  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.0DefaultApiVersion :此选项用于指定在请求中未指定任何版本时要使用的默认API版本。 这将默认版本为1.0

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

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

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

[源码] view plain

  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类。 像下面这样,

[源码] view plain

  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属性中:

[源码] view plain

  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选项

[源码] view plain

  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

[源码] view plain

  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

[源码] view plain

  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特性以退出版本控制

[源码] view plain

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

访问版本信息

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

[源码] view plain

    1. public string Get() => HttpContext.GetRequestedApiVersion().ToString();
时间: 2024-10-06 12:34:06

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

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

HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务端接口的耦合度.很多当今流行的RESTful API开发框架,包括Spring REST,也都默认支持HAL规范,当RESTful API被调用后,服务端就会返回ContentType为application/hal+json的JSON内容,例如: { "_links": { "

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

Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在自己做实验的过程中也碰到了一些问题,经过一些测试和搜索资料,基本解决了这些问题,本文也会对这些问题进行介绍,以免有相同需求的朋友多走弯路. 插件的下载与安装 至撰写本文为止,Visual Studio 2015 Tools

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

为什么要写这个? 在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效.稳定.可扩展,有时候还不得不考虑成本的问题.我希望能找到比较完整的开源解决方案来解决持续集成.监控报警.以及扩容和高可用性的问题.是学习和探索的过程分享给大家,也欢迎同行的人交流. 先来一个三步曲,我们将完成通过GitLab CI 自动部署 net core web api 到Docker 容器的一个示例.这是第一步,通过此文您将了解如何将net core web api 运行在Docker

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

对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你创建良好的文档和帮助页面. Swashbuckle 可以通过修改 Startup.cs 作为一组 NuGet 包方便的加入项目.Swashbuckle 是一个开源项目,为使用 ASP.NET Core MVC 构建的 Web APIs 生成 Swagger 文档.Swagger 是一个机器可读的 R

使用Swagger来生成asp.net core Web API 文档

对于构建一个消费应用程序,理解API的各个方法对开发这是一个不小的挑战.为了使你的API更利于阅读.使用Swagger为你的Web API生成好的文档和帮助页,.NET Core实现了Swashbuckle.AspNetCore,使用Swagger是非常简单的,只需添加一组Nuget包和修改Startup就可以搞定. .Swashbuckle.AspNetCore 开源项目, ASP.NET Core Web API生成Swagger文档的 .Swagger是一个机器可读的restful风格的a

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

在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走.今天,我们就研究一下在事件处理器中,对象生命周期的管理问题. 事实上,不仅仅是在事件处理器中,我们需要关心对象的生命周期,在整个ASP.NET Core Web API的应用程序里,我们需要理解并仔细推敲被注册到IoC容器中的服务,它们的生命周期应该是个怎样的情形,这也是服务端应用程序设

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

 一.前言 这几年前端的发展速度就像坐上了火箭,各种的框架一个接一个的出现,需要学习的东西越来越多,分工也越来越细,作为一个 .NET Web 程序猿,多了解了解行业的发展,让自己扩展出新的技能树,对自己的职业发展还是很有帮助的.毕竟,现在都快到9102年了,如果你还是只会 Web Form,或许还是能找到很多的工作机会,可是,这真的不再适应未来的发展了.如果你准备继续在 .NET 平台下进行开发,适时开始拥抱开源,拥抱 ASP.NET Core,即使,现在工作中可能用不到. 雪崩发生时,没有一

ASP.NET Core Web API Cassandra CRUD 操作

在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将使用 Postman 来完成. ASP.NET Core 是 ASP.NET 的重大的重构,ASP.NET Core 是一个全新的开源和跨平台的框架,用于构建如 Web 应用.物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序. ASP.NET Core 已经内置了用 MVC 架

docker中运行ASP.NET Core Web API

在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Core以及docker的基本概念,网上已经有很多文章对其进行介绍了,因此本文不会再详细讲解这些内容.对.NET Core和docker不了解的朋友,建议首先查阅与这些技术相关的文档,然后再阅读本文. 先决条件 要完成本文所介绍的演练任