几天前,我和我的朋友们使用 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()):

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddApiVersioning();
}

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
/* garbage code removed */
app.UseMvc();
app.UseApiVersioning();
}

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

[ApiVersion("2.0")]
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values
[MapToApiVersion("1.0")]
[HttpGet]
public IEnumerable<string> Get()
{
return Json(new string[] { "value1", "value2" });
}
}

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

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

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

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

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

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

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

[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class ValuesController : Controller
{
[HttpGet, MapToApiVersion("1.0")]
public IActionResult Get()
{
return Json(new string[] { "value1", "value2" });
}
}

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

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

public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.AddApiVersioning(options =>
{
options.ApiVersionReader = new MediaTypeApiVersionReader();
options.AssumeDefaultVersionWhenUnspecified = true;
options.ApiVersionSelector = new CurrentImplementationApiVersionSelector(options);
});
}

现在,当您发送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/

原文地址: https://www.codeproject.com/Tips/1197505/ASP-NET-Core-API-Versioning-in-Simple-Words-Update
翻译:Sweet Tang
本文地址:http://www.cnblogs.com/tdfblog/p/asp-net-core-api-versioning.html
欢迎转载,请在明显位置给出出处及链接。

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

  1. ASP.NET Core API 版本控制

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

  2. 【ASP.NET Core】ASP.NET Core API 版本控制

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

  3. 详解ASP.NET Core API 的Get和Post请求使用方式

    上一篇文章帮助大家解决问题不彻底导致博友使用的时候还是遇到一些问题,欢迎一起讨论.所以下面重点详细讲解我们常用的Get和Post请求( 以.net core2.2的Http[Verb]为方向 ,推荐该 ...

  4. ASP.NET Core API 接收参数去掉烦人的 [FromBody]

    在测试ASP.NET Core API 项目的时候,发现后台接口参数为类型对象,对于PostMan和Ajax的Post方法传Json数据都获取不到相应的值,后来在类型参数前面加了一个[FromBody ...

  5. ASP.NET CORE API Swagger+IdentityServer4授权验证

    简介 本来不想写这篇博文,但在网上找到的文章博客都没有完整配置信息,所以这里记录下. 不了解IdentityServer4的可以看看我之前写的入门博文 Swagger 官方演示地址 源码地址 配置Id ...

  6. ASP.NET Core API ——Dapper的使用

    ASP.NET Core API ——Dapper的使用 简介:Dapper是一个ORM框架,负责数据库和程序语言之间的映射. 使用步骤: l  创建一个IDBConnection的接口对象 l  编 ...

  7. ASP.NET Core API总结(一)

    ASP.NET Core API 问题:当应用收到一个http请求之后,API应用程序是怎么一步步执行的. 注册服务——构造容器——使用服务——创建对象 1.         创建一个新的API之后, ...

  8. Asp .net core api+Entity Framework 实现数据的存取到数据库中

    最近在学dotNetCore 所以尝试了一下api 这个功能 不多说了大致实现如下 1.用vs2017建立一个Asp.net  Core Web 应用程序 在弹出的对话框中选择 Web API 项目名 ...

  9. Asp.Net Core API网关Ocelot

    首先,让我们简单了解下什么是API网关? API网关是一个服务器,是系统的唯一入口.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具 ...

随机推荐

  1. python no module named 'win32api'

    在cmd下执行 pip install pypiwin32api   即可

  2. 02:Django进阶篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  3. centos 安装最新稳定版本docker

    直接yum安装的docker版本是 : docker --versionDocker version 1.12.6, build 85d7426/1.12.6 一些新特性需要安装最新的稳定版本 国内可 ...

  4. Ruby基础教程

    一.Ruby基础知识 1.关于Ruby Ruby是脚本语言 Ruby是面向对象语言 Ruby是跨平台语言 Ruby是开放源码软件 2.Ruby入门书籍推荐 <Ruby.Programming向R ...

  5. 小朋友排队|2014年蓝桥杯B组题解析第十题-fishers

    小朋友排队 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度.开始的时候,所有小朋友的不高兴程度都是0. 如果某个小朋 ...

  6. Sql 最简单的Sqlserver连接

    string name = txtUserName.Text.Trim();//移除用户名前部和后部的空格 string pwd = txtUserPwd.Text.Trim();//移除密码前部和后 ...

  7. vuejs全局api概念

    什么是全局API? 全局API并不在构造器里,而是先声明全局变量或者直接在Vue上定义一些新功能,Vue内置了一些全局API,比如我们今天要学习的指令Vue.directive.说的简单些就是,在构造 ...

  8. 使用InputStreamReader读入,使用OutputStreamWriter写出,将一首诗按行重写?

    https://www.processon.com/view/link/5b1a3880e4b00490ac8f5f40 改善后: (可将不管一行有几个字时的不规律的文本,按行倒写) package ...

  9. HDU 5887 Herbs Gathering(搜索求01背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=5887 题意: 容量很大的01背包. 思路: 因为这道题目背包容量比较大,所以用dp是行不通的.所以得用搜索来做, ...

  10. HTTP协议中TCP的三次握手 and HTTPS

    https://www.cnblogs.com/zxh930508/p/5432700.html https://www.cnblogs.com/digdeep/p/4832885.html