写点什么

版本化 ASP.NET Core WebApi

作者:喵叔
  • 2021 年 11 月 16 日
  • 本文字数:1646 字

    阅读完需:约 5 分钟

大部分使用 Web API 的网站都会使用版本化 Web API,这是因为当我们升级 Web API 的时候并不能保证所有的客户端使用的都是最新的 Web API,有些旧版本的客户端很有可能使用的某个甚至某几个在新的 Web API 中已经废除的接口。如果这时我们部署新的 Web API 的话,旧版本的客户端就无法使用了。因此 Web API 的版本化就出来了。下面我们就来一步一步的实现 Web API 的版本化。首先我们需要引如 Microsoft.AspNetCore.Mvc.Versioning 包,通过 Visual Studio 的 nuget 安装即可。当包成功添加到项目之后,就需要在 Startup 的 ConfigureServices 方法中将 ApiVersioning 注入到容器中,代码如下:


//more code//...using Microsoft.AspNetCore.Mvc.Versioningpublic class Startup{    public void ConfigureServices(IServiceCollection services)    {      //more code      //...        services.AddControllers();        //注入ApiVersioning        services.AddApiVersioning();        //more code        //...    }}
复制代码


上面的代码只不过是默认的方法,在实际项目中我们会对它做全局配置,代码如下:


//more code//...using Microsoft.AspNetCore.Mvc.Versioningpublic class Startup{    public void ConfigureServices(IServiceCollection services)    {      //more code      //...        services.AddControllers();        services.AddApiVersioning(p =>        {          //在请求的响应头部显示所有拥有的版本号            p.ReportApiVersions = true;            //在请求链接中未设置版本时使用默认版本            p.AssumeDefaultVersionWhenUnspecified = true;            //默认版本号            p.DefaultApiVersion = new ApiVersion(1, 0);        });        //more code        //...    }}
复制代码


接下来就是使用版本号了,我们需要在 Controller 上面加上属性 ApiViersion,并指定版本号,例如下面的代码:


[ApiVersion("2.0")][ApiController][Route("api/[controller]")]public class TestController : ControllerBase{    [HttpGet]    public IActionResult Get()    {        //more code        //....    }}
复制代码


从上面的代码中可以看出,我们在 TestController 控制器上标记了这个控制器的版本是 2.0,那么我们要访问这个控制器的化就需要指定版本号,就像下面的连接那样:接下来如何访问呢?可以通过如下链接:http://localhost:3345/api/test?api-version=2.0。2.0 版本的 Get 是有了,那么 1.0 的 Get 呢?代码应该怎么写呢?一般来说在实际开发中会用两个命名空间来表示相应的版本号,例如下面这样的代码:


//1.0版本namespace TestVersion.Controllers.v1{    [ApiVersion("1.0")]    [ApiController]    [Route("api/[controller]")]    public class TestController : ControllerBase    {      [HttpGet]      public IActionResult Get()      {          //more code          //....      }    }}//2.0版本namespace TestVersion.Controllers.v2{    [ApiVersion("2.0")]    [ApiController]    [Route("api/[controller]")]    public class TestController : ControllerBase    {        [HttpGet]      public IActionResult Get()      {          //more code          //....      }    }}
复制代码


上面的代码解决了不同版本号的问题,但是这种方法并不完美,它不符合 Restful 规范,我们可以使用 路由指定版本号,下面就是修正后的代码:


[ApiVersion("2.0")][ApiController][Route("api/{version:apiVersion}/[controller]")]public class TestController : ControllerBase{    [HttpGet] public IActionResult Get() {     //more code     //.... }}
复制代码


在代码中,我们将 [Route("api/[controller]")] 修改为了成了 [Route("api/{version:apiVersion}/[controller]")],那么我们访问的时候地址将变为:http://localhost:3345/api/1.0/test

发布于: 3 小时前阅读数: 4
用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
版本化ASP.NET Core WebApi