You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:06:07