几天前,我和我的朋友们使用 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. c++学习之map基本操作

    map作为最常用的数据结构之一,用的好可以大幅度的提升性能. // java_cpp_perftest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h& ...

  2. VC++ 获取文件属性创建时间、修改时间和访问时间

    转载:http://blog.sina.com.cn/s/blog_66bf8d8301014ikd.html WIN32_FIND_DATA结构 关于文件的全部属性信息,总计有以下以下9 种:文件的 ...

  3. C#对两种类型动态库的使用

    一.托管:如果一个动态库本身是基于.NET的,那么可以直接在工程引用里右键添加引用,如微软的COM技术[因为你依托的是微软的框架,所以需要regsvr32注册] 二.非托管:如果不是基于.NEt的,那 ...

  4. Python3基础 os listdir curdir 查看当前工作目录的所有文件的名字

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  5. JS控制页面内容

    JS操作页面内容 innerText:普通标签内容(自身文本与所有子标签文本)innerHTML:包含标签在内的内容(自身文本及子标签的所有)value:表单标签的内容outerHTML:包含自身标签 ...

  6. Mysql数据库基础知识

    什么是Mysql数据库 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQ ...

  7. 【ssh免登录】设置集群环境ssh免登录步骤

    1.每台机器都需要执行,生成自己的密钥 # ssh-keygen -t rsa 过程中遇到选项,全部enter #cd ~/.ssh # cat id_rsa.pub > authorized_ ...

  8. python datetime模块来获取当前的日期和时间

    #!/usr/bin/python # -*- coding: UTF- -*- import datetime i = datetime.datetime.now() print ("当前 ...

  9. ubuntu 14.04(desktop amd 64) nginx 安装启动停止

    sudo apt-get install nginx 关闭: sudo service nginx stop 启动: sudo nginx

  10. c语言 快速排序

    #include<stdio.h> #include<stdlib.h> #define BUF_SIZE 10 void display(int array[], int m ...