如何用Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer设置.NET Core REST API版本为major.minor.patch格式
实现ASP.NET Core API的major.minor.patch版本格式
当然可以实现这个需求!我之前在项目里也调整过版本号的格式,下面是具体的操作步骤,帮你替换默认的版本格式为major.minor.patch:
1. 配置ApiVersioning服务
首先在Program.cs(.NET 6+)或者Startup.cs(.NET 5及更早)中配置API版本控制,重点是设置版本的格式规则:
builder.Services.AddApiVersioning(options => { // 指定从URL路径中读取版本号 options.ApiVersionReader = new UrlSegmentApiVersionReader(); // 设置默认版本(如果请求没指定版本时使用) options.DefaultApiVersion = new ApiVersion(1, 1, 1); options.AssumeDefaultVersionWhenUnspecified = true; // 允许客户端请求特定版本,同时支持默认版本回退 }) .AddApiExplorer(options => { // 核心配置:定义版本组的格式为v{major}.{minor}.{patch} // "VVV"格式符会完整输出major.minor.patch(如果patch存在的话) options.GroupNameFormat = "'v'VVV"; // 允许在生成的URL中自动替换版本号(适配Swagger文档等场景) options.SubstituteApiVersionInUrl = true; });
这里的GroupNameFormat = "'v'VVV"是关键:VVV是ApiVersion提供的格式符,会将版本对象完整格式化为major.minor.patch(当你定义包含patch的ApiVersion时),加上单引号包裹的v,就会生成v1.1.1这样的格式。
2. 给控制器标注版本并配置路由
接下来在你的控制器上指定版本号,同时配置对应的路由模板:
[ApiVersion("1.1.1")] // 路由中的{version:apiVersion}会匹配我们定义的版本格式 [Route("api/v{version:apiVersion}/foo")] [ApiController] public class FooController : ControllerBase { [HttpGet] public IActionResult GetFoo() { return Ok($"Response from API version: {HttpContext.GetRequestedApiVersion()}"); } }
如果需要支持多个版本,比如同时存在v1.1.0和v1.1.1,只需要创建对应的控制器或者在同一个控制器上添加多个[ApiVersion]标注即可:
[ApiVersion("1.1.0")] [ApiVersion("1.1.1")] [Route("api/v{version:apiVersion}/foo")] [ApiController] public class FooController : ControllerBase { [HttpGet, MapToApiVersion("1.1.0")] public IActionResult GetFooV1_1_0() { return Ok("Response from v1.1.0"); } [HttpGet, MapToApiVersion("1.1.1")] public IActionResult GetFooV1_1_1() { return Ok("Response from v1.1.1"); } }
3. 验证效果
启动项目后,访问/api/v1.1.1/foo就能正确路由到对应的版本方法,完全符合你期望的URL格式。
如果需要集成Swagger文档,这个配置也能让Swagger自动生成对应版本的文档分组,格式也是v1.1.1,非常方便。
内容的提问来源于stack exchange,提问作者iticek
相关产品推荐
相关产品推荐

