几天前,我和我的朋友们使用 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入门之实现简单的购物车功能

    Talk is cheap,Let's do this! product_list = [ ['Iphone7 Plus', 6500], ['Iphone8 ', 8200], ['MacBook ...

  2. 02: 安装epel 解决centos7无法使用yum安装nginx

    参考网址: http://www.mamicode.com/info-detail-1671603.html 1.yum命令安装 yum install epel-release -y 2.更新数据 ...

  3. 移动页面click延迟引发的touch问题

    一.事件捕获与冒泡 先扯一下事件的触发流程,这个之后会用到. DOM2级事件规定事件包括三个阶段: ① 事件捕获阶段 ② 处于目标阶段 ③ 事件冒泡阶段 大概的流程就是事件从最外层一层一层往里面传递( ...

  4. noip 2013 提高组 Day2 部分题解

    积木大赛: 之前没有仔细地想,然后就直接暴力一点(骗点分),去扫每一高度,连到一起的个数,于是2组超时 先把暴力程序贴上来(可以当对拍机) #include<iostream> #incl ...

  5. 【LTE基础知识】SGLTE, SVLTE, CSFB, VoLTE【转】

    本文转载自:https://blog.csdn.net/henryghx/article/details/18416405 4G网络下实现语音通话功能的技术共有三种——VoLTE.SGLTE(GSM ...

  6. hdu 3415 Max Sum of Max-K-sub-sequence 单调队列优化DP

    题目链接: https://www.cnblogs.com/Draymonder/p/9536681.html 同上一篇文章,只是 需要记录最大值的开始和结束的位置 #include <iost ...

  7. CMD与AMD区别

  8. ubuntu16.04上安装Java

    1.下载jdk8 登录网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选择 ...

  9. signal_windows

    1.Qt532(vs2010 opengl) // ZC: windows signal: // http://blog.csdn.net/mergerly/article/details/79521 ...

  10. vs2010的VCVARS32.BAT所在位置

    1. C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat 2. ZC:vs08 和 vs2010 安装好后, ...