版本化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
。
相关文章
- AWS 加入 .NET 基金会
- 全新推出 – 下一代 I/O 优化的 EC2 实例 (I3en)
- 使用 Amazon EBS 优化实例突发功能提高应用程序性能并降低成本
- WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能
- 在 Asp.Net Core 中什么是认证和授权
- WPF中用户控件和自定义控件
- WPF常用UI库和图表库(MahApps、HandyControl、LiveCharts)
- WPF 日期选择器和时间选择器
- WPF-带填充的 WrapPanel
- .Net 7 团队把国内的龙芯确实当做一等公民和弃用的项目
- Android WebView不能加载ajax?加载ajax无效?
- asp.net之treeview无法显示树结点图标(IP与域名的表现竟不一样)
- STM32F401的外部中断EXTI
- 通过ionice和nice降低shell脚本运行的优先级
- SpringMVC的Ajax提交
- CLion + MinGW64配置C语言开发环境 Visual Studio安装
- 2023 年 dotnet 仓库社区年度调查已经开始
- 单片机IO直接驱动继电器,你想多了
- 为什么大家都用三极管来配合单片机IO口驱动负载
- Ajax文件上传时:Formdata、File、Blob的关系