版本化ASP.NET Core WebApi

简介: 版本化ASP.NET Core WebApi

大部分使用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.Versioning
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
      //more code
      //...
        services.AddControllers();
        //注入ApiVersioning
        services.AddApiVersioning();
        //more code
        //...
    }
}

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

//more code
//...
using Microsoft.AspNetCore.Mvc.Versioning
public 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


目录
相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
1月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
29 1
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
25天前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
前端开发 NoSQL .NET
一起谈.NET技术,重构TekPub——从ASP.NET MVC框架迁移到Ruby on Rails
  TekPub是一个面向开发人员的站点,致力于为开发人员提供一系列主题的在线培训,主题范围非常广泛,从微软的O/R Mapping框架Microsoft Entity Framework,到如何使用Ruby on Rails技术编写自己的日志引擎等内容都有涉及。
1636 0
|
Web App开发 SQL 前端开发
一起谈.NET技术,鲜为人知的ASP.NET MVC 2.0框架高效之谜
  要想建立开发环境,你需要安装Visual Studio 2008/2010 Beta 2,以及SQL Express 2005(可免费从MSDN下载)和MVC 2.0框架。我把本文中的示例Web应用命名为“Employee Master Information”。
1012 0
|
XML 前端开发 .NET
一起谈.NET技术,ASP.NET MVC 2生成动态表单的一种最简单的思路
  在BPM、OA等系统中,都会存在一个表单设计器。有些是通过操作gridview来完成一个表单的设计;有些是通过类似VS拖拽的方法完成一个表单的设计。很明显后面一种优越于前面一种。无论是哪种,最后都会产生一些XML之类的表单结构的数据。
1309 0
|
缓存 算法 .NET
一起谈.NET技术,ASP.NET缓存全解析7:第三方分布式缓存解决方案 Memcached和Cacheman
  ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓存 ASP.NET 缓存全解析5:文件缓存依赖 ASP.NET 缓存全解析6:数据库缓存依赖 ASP.NET 缓存全解析7:第三方分布式缓存解决方案 Memcached和Cacheman   Memcached — 分布式缓存系统    1.Memcached是什么?   Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
1194 0
|
前端开发 .NET
一起谈.NET技术,ASP.NET MVC 2扩展点之Model Binder
  Model Binder在Asp.net MVC中非常简单。简单的说就是你控制器中的Action方法需要参数数据;而这些参数数据包含在HTTP请求中,包括表单上的Value和URL中的参数等。而ModelBinder的功能就是将这些个表单上的Value和URL中的参数换成对象,然后将这些对象绑定到Action的参数上面。
1063 0
|
Web App开发 前端开发 .NET
一起谈.NET技术,13个不可不知的ASP.NET MVC扩展点
ASP.NET MVC设计的主要原则之一是可扩展性。处理管线(processing pipeline)上的所有(或大多数)东西都是可替换的。因此,如果您不喜欢ASP.NET MVC所使用的约定(或缺乏某些约定),您可以创建自己的服务来支持您的约定,并将其注入到主管线中。
1268 0