几天前,我和我的朋友们使用 ASP.NET Core 开发了一个API ,使用的是GET方式,将一些数据返回到客户端 APP。我们在前端进行了分页,意味着我们将所有数据发送给客户端,然后进行一些data.length操作,以获得items count用于分页逻辑。为了减少HTTP请求的负荷,我们决定在后端(服务器端分页)实现逻辑。在我们这样的情况下,这是没有任何问题的,因为我们在客户端能快速实现。我们在客户端和服务端修改了所有逻辑,并且快速完成所有功能。

但是,您可能会有其他客户端在使用,因为只提供了一个数据源(API)。在一个API中引入突破性的变化可以支持一个客户端,但同时破坏了其它客户端。例如,假设您的手机团队正在度假,并且您的 Web 团队正在为了支持该服务器端分页功能开展工作。为了支持Web团队,您在API中做了一个简单的更改。这个变更,您和您的Web团队都很高兴(如果感到幸福你就拍拍手)。噩梦开始了,您会发现因为一个很简单(其实是突破性)的变化,数百万移动客户端不工作,用户会卸载APP。当您发现你们都不是移动应用程序开发人员,也没有访问源代码权限时,更多的恶梦来了。现在您只能选择降级您的 API 和 Web 应用程序,但是,Web 应用程序的开发团队现在也去度假了。因为更多的恶梦会接踵而至,所有的事情都只能停滞不前。

也许(不是也许,就是!)API版本控制是在这种情况下,是一个非常不错的选择。使用 API 版本控制,您不仅可以安全地针对这些突破性的更改,还可以支持这些更改,这对每个人都是双赢的。

我们来看一看如何在 ASP.NET Core 中配置 API 版本。

注意:我正在使用一个空的 ASP.NET Core Web API 项目(.NET Core 1.1)

通过 NuGet 安装此软件包:Microsoft.AspNetCore.Mvc.Versioning。现在,在Startup.cs类的ConfigureServices()方法中配置服务(services.AddApiVersioning()):

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddMvc();
  4. services.AddApiVersioning();
  5. }

当您使用的是Microsoft.AspNetCore.Mvc.Versioning 的1.1.1版本时,只需要使用app.UseApiVersioning()方法:

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env,
  2. ILoggerFactory loggerFactory)
  3. {
  4. /* garbage code removed */
  5. app.UseMvc();
  6. app.UseApiVersioning();
  7. }

接下来,您必须使用ApiVersion定义要支持 API 版本控制的控制器(多个版本)。同样,您还必须使用MapToApiVersion定义特定Action API版本号:

  1. [ApiVersion("1.0")]
  2. [Route("api/[controller]")]
  3. public class ValuesController : Controller
  4. {
  5. // GET api/values
  6. [MapToApiVersion("1.0")]
  7. [HttpGet]
  8. public IEnumerable<string> Get()
  9. {
  10. return Json(new string[] { "value1", "value2" });
  11. }
  12. }

现在通过GET方式的调用Action,您必须指定 API 版本,暂时使用查询字符串版本控制方式。这样,您将直接在查询字符串中指定 API 版本。例如这个:http://localhost:5000/api/values?api-version=1.0

如果您将 API 版本控制添加到现有的API项目中,则可以告知 ASP.NET Core 将默认的控制器和Action视为版本1.0。为此,配置AddApiVersioning()服务如下所示:

  1. services.AddApiVersioning(options => options.AssumeDefaultVersionWhenUnspecified = true);

现在可以像这样 http://localhost:5000/api/values 调用API ,不会导致任何错误。

可以通过三种方式指定API版本:

  • 查询字符 (已经讨论过)
  • URL路径
  • 媒体类型(Media Type)

通过URL路径的方式,您可以将版本号作为URL路径的一部分传递。像这样的例子 http://localhost:5000/api/v1/values 。顺便说一句,您必须修改您的路由属性以适应版本段,如下所示:

  1. [ApiVersion("1.0")]
  2. [Route("api/v{version:apiVersion}/[controller]")]
  3. public class ValuesController : Controller
  4. {
  5. [HttpGet, MapToApiVersion("1.0")]
  6. public IActionResult Get()
  7. {
  8. return Json(new string[] { "value1", "value2" });
  9. }
  10. }

请注意,字母v不是强制要添加在版本号之前,这只是一个惯例。

最后,您可以将服务配置为从特定的媒体类型(默认情况下,从content-type媒体类型读取,您可以配置自己的媒体类型)读取API版本号。如下所示,配置您的服务,以激活媒体类型版本控制:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. // Add framework services.
  4. services.AddMvc();
  5. services.AddApiVersioning(options =>
  6. {
  7. options.ApiVersionReader = new MediaTypeApiVersionReader();
  8. options.AssumeDefaultVersionWhenUnspecified = true;
  9. options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);
  10. });
  11. }

现在,当您发送HTTP请求时,在请求头中content-type指定API版本号,如下所示(content-type: application/json;v=2.0):

顺便说一句,使用CurrentImplementationApiVersionSelector,如果没有在content-type媒体类型中定义版本,将使用最新的API版本。在下面的示例中,我没有提到任何版本号,所以它在所有版本中使用最新版本。

这不是全部的功能,还有其它很酷的功能,您可以在 Microsoft 的 Microsoft's ASP.NET API Versioning git存储库中找到这些功能:https://github.com/Microsoft/aspnet-api-versioning/wiki

发现一篇同类型的文章,讲解的更详细,供大家参考:http://www.talkingdotnet.com/support-multiple-versions-of-asp-net-core-web-api/

原文地址: http://www.cnblogs.com/tdfblog/p/asp-net-core-api-versioning.html
翻译:Sweet Tang
本文地址:http://www.cnblogs.com/yanglang/p/7232427.html
欢迎转载,请在明显位置给出出处及链接。

 

【ASP.NET Core】ASP.NET Core API 版本控制的更多相关文章

  1. ASP.NET Core API 版本控制

    几天前,我和我的朋友们使用 ASP.NET Core 开发了一个API ,使用的是GET方式,将一些数据返回到客户端 APP.我们在前端进行了分页,意味着我们将所有数据发送给客户端,然后进行一些dat ...

  2. ASP.NET Core 实战:构建带有版本控制的 API 接口

    一.前言 在上一篇的文章中,主要是搭建了我们的开发环境,同时创建了我们的项目模板框架.在整个前后端分离的项目中,后端的 API 接口至关重要,它是前端与后端之间进行沟通的媒介,如何构建一个 “好用” ...

  3. 【转】ASP.NET Core API 版本控制

    几天前,我和我的朋友们使用 ASP.NET Core 开发了一个API ,使用的是GET方式,将一些数据返回到客户端 APP.我们在前端进行了分页,意味着我们将所有数据发送给客户端,然后进行一些dat ...

  4. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  5. ASP.NET Core 3.x API版本控制

    前言 一般来说需要更改我们API的时候才考虑版本控制,但是我觉得我们不应该等到那时候来实现它,我们应该有一个版本策略从我们应用程序开发时就开始制定好我们的策略,我们一直遵循着这个策略进行开发. 我们其 ...

  6. ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现

    from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...

  7. 从头编写 asp.net core 2.0 web api 基础框架 (1)

    工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...

  8. 从头编写 asp.net core 2.0 web api 基础框架 (3)

    第一部分:http://www.cnblogs.com/cgzl/p/7637250.html 第二部分:http://www.cnblogs.com/cgzl/p/7640077.html 之前我介 ...

  9. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (3)

    Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratc ...

随机推荐

  1. Java基础——网络编程

    一.网络编程概述 概述: Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序. Java提供的网络类库,可以实现无痛的网络连接,联网 ...

  2. Python破解压缩包密码问题

    所用知识 1. Pool 进程池 2. try...except 异常处理 3.枚举的方式 4.生成器的运用 逻辑关系 通过生成假密码去碰撞!捕获异常,一直碰撞,直到生成的密码与压缩包建立的密码对应, ...

  3. springboot之redis的应用

    1.redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted se ...

  4. Awesome Django

     Awesome Django    If you find Awesome Django useful, please consider donating to help maintain it. ...

  5. 初试Docker on Debian on VirtualBox

    一直以来都对Docker如雷贯耳,很想尝试一下但都被各种忙给耽误了,最近由于项目调试,需要安装 Oracle 和 SQL Server 数据库,但又不想安装到本机系统里,于是下决心啃一下docker这 ...

  6. dubbo入门(一)

    1.简介 Dubbo由阿里巴巴开源,是一个分布式服务框架,致力于提供高性能和透明化的RPC(远程过程调用)远程服务调用方案,以及SOA服务治理方案.如果没有分布式的需求,Dbubbo是不需要的,其本质 ...

  7. redmine本地安装部署

    1.railsinstaller-3.2.0.exe 下载地址 http://railsinstaller.org/en 安装railsinstaller  一直点next就可以了,安装完成之后C盘会 ...

  8. 制作一个App的完整流程是哪些

    APP开发流程其实并不复杂,但是对于客户来说,.一般移动APP开发都离不开UI设计师.前端开发.后端开发.测试专员.产品经理等,由于他们的工作性质都不一样,我们且先把APP软件开发项目分为三个阶段: ...

  9. Ubuntu16.04安装wps办公软件解决文字缺失

    先到wps官网下载linux版wps安装包 选择64位的alpha版本下载: 下载完后,同样是cd到Downloads目录,用dpkg命令来安装它: cd  Downloads/ sudo dpkg ...

  10. 1208: [HNOI2004]宠物收养所

    1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12030 Solved: 4916 Description ...