【问题标题】:How to do API versioning in ASP.NET ZERO Web API?如何在 ASP.NET ZERO Web API 中进行 API 版本控制?
【发布时间】:2020-10-19 19:40:20
【问题描述】:
我正在使用 ASP.NET ZERO(Angular 和 ASP.Net Core 模板)。
如何创建不同的 API 版本,我想支持不同的版本以实现向后兼容。
例如
/api/services/app/Customer/GetAll - 这是当前版本
/api/services/app/v2/Customer/GetAll - 这是我要创建的下一个版本。并且希望同时支持这两个版本。
有人可以指导我完成这个吗?
【问题讨论】:
标签:
asp.net-boilerplate
api-versioning
【解决方案1】:
ASP.NET API Versioning 旨在使用您选择的任何方法解决这个确切的问题,包括上面列出的所有方法。有各种配置的大量文档和示例。您可以删除 API 版本控制,只需对现有应用程序进行几乎没有更改。如果需要,还支持 OpenAPI/Swagger。
模板只是脚手架。无论您最初如何启动或创建项目,您都可以使用 API 版本控制。
尽管它很受欢迎,但我建议不要按 URL 段进行版本控制。如果您关心遵守 REST 约束,那么它是 RESTful 最少的方法(它违反了 URL 作为 Uniform Interface 约束下的标识符)。如果你有选择,我会考虑其他方法。虽然不是最 RESTful,但查询字符串方法通常是最实用的,易于使用且不违反任何约束。
如果您有问题,我很乐意进一步详细说明或回答。
【解决方案2】:
您可以通过多种方式实现 API 版本控制。
- URI 的
- 查询字符串
- 版本标题
- 接受标头
- 媒体类型
为了回答你的问题,下面是示例。
定义路线
config.Routes.MapHttpRoute(
name: "Version1",
routeTemplate: "api/v1/Students/{id}",
defaults: new { id = RouteParameter.Optional, controller = "StudentsV1" }
);
config.Routes.MapHttpRoute(
name: "Version2",
routeTemplate: "api/v2/Students/{id}",
defaults: new { id = RouteParameter.Optional, controller = "StudentsV2" }
);
使用路由属性
public class StudentsV1Controller : Controller
{
[Route("api/v1/students")]
public IEnumerable<StudentV1> Get() {...}
[Route("api/v1/students/{id}")]
public StudentV1 Get(int id) {...}
}
public class StudentsV2Controller : Controller
{
[Route("api/v2/students")]
public IEnumerable<StudentV2> Get() {...}
[Route("api/v2/students/{id}")]
public StudentV2 Get(int id) {...}
}
参考:https://csharp-video-tutorials.blogspot.com/2017/02/web-api-versioning-using-uri.html