在.NET 6 Minimal APIs中能否使用AspNet Api Versioning?如何实现?
完全可以在.NET 6 Minimal APIs中使用AspNet Api Versioning,具体实现流程如下:
实现步骤
1. 安装依赖NuGet包
首先安装专门适配Minimal APIs的版本管理包:
- 包管理器命令:
Install-Package Asp.Versioning.Http - .NET CLI命令:
dotnet add package Asp.Versioning.Http
2. 注册Api版本服务
在Program.cs的服务注册区域添加如下配置:
var builder = WebApplication.CreateBuilder(args); // 注册Api版本核心服务 builder.Services.AddApiVersioning(options => { // 配置默认版本号 options.DefaultApiVersion = new Asp.Versioning.ApiVersion(1, 0); // 未指定版本时默认使用默认版本 options.AssumeDefaultVersionWhenUnspecified = true; // 响应头中返回接口支持的所有版本信息 options.ReportApiVersions = true; // 配置版本参数的读取方式,默认同时支持查询参数、请求头、URL路径三种方式 options.ApiVersionReader = Asp.Versioning.ApiVersionReader.Combine( new Asp.Versioning.QueryStringApiVersionReader("api-version"), new Asp.Versioning.HeaderApiVersionReader("x-api-version"), new Asp.Versioning.UrlSegmentApiVersionReader() ); }) // 可选配置:如果需要对接Swagger生成版本化接口文档,添加以下扩展 .AddApiExplorer(options => { options.GroupNameFormat = "'v'VVV"; options.SubstituteApiVersionInUrl = true; }); // 其余你的原有服务注册逻辑,比如MediatR、自定义服务等 builder.Services.AddMediatR(typeof(Program).Assembly); builder.Services.AddScoped<IService, YourServiceImpl>(); var app = builder.Build();
3. 启用版本中间件
在中间件管道最前端启用Api版本中间件:
app.UseApiVersioning(); // 其余原有中间件配置,比如HttpsRedirection、Authorization等
4. 为Minimal API接口绑定版本
共有两种常用的绑定方式,可按需选择:
方式1:单个接口独立指定版本
适合零散接口的版本配置,你的原有代码改造示例如下:
// v1版本的countries接口 app.MapGet("countries", async (IService service, IMediator mediator, ApiVersion version) => { var request = new GetCountriesRequest(); var countries = await mediator.Send(request); return Results.Ok(new { ApiVersion = version.ToString(), Data = countries }); }) .HasApiVersion(1.0); // 绑定v1版本 // v2版本的countries接口 app.MapGet("countries", async (IService service, IMediator mediator, ApiVersion version) => { var request = new GetCountriesV2Request(); var countries = await mediator.Send(request); return Results.Ok(new { ApiVersion = version.ToString(), Data = countries }); }) .HasApiVersion(2.0); // 绑定v2版本
方式2:版本组批量绑定
适合同版本的批量接口,减少重复配置:
// 定义v1版本组 var v1Set = app.NewApiVersionSet() .HasApiVersion(1.0) .ReportApiVersions() .Build(); // 定义v2版本组 var v2Set = app.NewApiVersionSet() .HasApiVersion(2.0) .ReportApiVersions() .Build(); // 同组内接口自动继承版本配置 app.MapGet("countries", async (IMediator mediator) => { return Results.Ok(await mediator.Send(new GetCountriesRequest())); }) .WithApiVersionSet(v1Set); app.MapGet("cities", async (IMediator mediator) => { return Results.Ok(await mediator.Send(new GetCitiesRequest())); }) .WithApiVersionSet(v1Set);
可选:URL路径携带版本
如果你希望版本号直接暴露在URL路径中(格式如/v1/countries),只需修改路由模板即可:
app.MapGet("v{version:apiVersion}/countries", async (IMediator mediator) => { return Results.Ok(await mediator.Send(new GetCountriesRequest())); }) .HasApiVersion(1.0);
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

