惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Jina AI
Jina AI
The Cloudflare Blog
V
Visual Studio Blog
博客园_首页
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
博客园 - Franky

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
.NET 10 使用 Microsoft.AspNetCore.OpenApi 实现 API 版本管理
邓磊Lei · 2026-05-05 · via 博客园_首页

为什么 API 版本管理如此重要?

API 版本管理的核心目标是:在不破坏现有用户的前提下,持续迭代和改进 API。通过版本管理,我们可以:

  • 引入新功能:在新版本中添加字段、接口等,而不影响旧版本的用户。
  • 修复 bug:在新版本中修复问题,而不冒破坏旧版本的风险。
  • 逐步淘汰:在新版本中移除过时的功能,给用户足够的时间迁移。

常见的版本策略有这几种:

  • URL 路径版本:/api/v1/users,直观,最常见
  • 查询参数版本:/api/users?api-version=1.0
  • 请求头版本:X-API-Version: 1.0
  • 媒体类型版本:Accept: application/json; v=1.0(GitHub 在用这种方式)

每种方式都有适用场景,没有绝对的优劣。

在 C# 生态中,长期以来的事实标准是 Swashbuckle.AspNetCore,但它并没有内置版本管理支持,需要配合 Asp.Versioning 来实现。

终于,在 .NET 10 中,微软推出了自己的 OpenAPI 库 Microsoft.AspNetCore.OpenApi,并且 Asp.Versioning v10 也正式支持了这个库,版本管理和文档生成终于可以无缝结合了。

上手 Microsoft.AspNetCore.OpenApi 和 Asp.Versioning

要使用 Microsoft.AspNetCore.OpenApi 和 Asp.Versioning 来实现 API 版本管理,首先需要安装相关 NuGet 包:

#package: Asp.Versioning.Http 10.0.0
#package: Asp.Versioning.Mvc 10.0.0
#package: Asp.Versioning.Mvc.ApiExplorer 10.0.0
#package: Microsoft.AspNetCore.OpenApi 10.0.0
#package: Scalar.AspNetCore 2.6.0

安装完成后,在 Program.cs 中进行如下配置:

services
    .AddApiVersioning(options =>
    {
        options.DefaultApiVersion = new ApiVersion(1, 0);
        options.AssumeDefaultVersionWhenUnspecified = true;
        options.ReportApiVersions = true;
        options.ApiVersionReader = new UrlSegmentApiVersionReader();
    })
    .AddMvc()
    .AddApiExplorer(options =>
    {
        options.GroupNameFormat = "'v'V";
        options.SubstituteApiVersionInUrl = true;
    });

services.AddOpenApi("v1", options =>
{
    options.ShouldInclude = apiDescription => apiDescription.GroupName == "v1";
});

services.AddOpenApi("v2", options =>
{
    options.ShouldInclude = apiDescription => apiDescription.GroupName == "v2";
});

app.MapOpenApi();
app.MapScalarApiReference(options =>
{
    options
        .WithTitle("Users API - {documentName}")
        .AddDocuments(new[] { "v1", "v2" });
});

在上面的代码中,我们首先配置了 API 版本管理,指定了默认版本、版本读取方式等。然后,我们为每个版本配置了 OpenAPI 文档生成,确保每个版本都有独立的文档。最后,我们映射了 OpenAPI 和 Scalar API Reference 的路由。

控制器方面,我们可以使用特性来指定版本:

[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class UsersController : ControllerBase
{
    [HttpGet]
    [MapToApiVersion("1.0")]
    public IActionResult GetV1()
    {
        return Ok(new { Version = "v1", Users = new[] { "Alice", "Bob" } });
    }
}

[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("2.0")]
public class UsersV2Controller : ControllerBase
{
    [HttpGet]
    [MapToApiVersion("2.0")]
    public IActionResult GetV2()
    {
        return Ok(new { Version = "v2", Users = new[] { "Alice", "Bob", "Charlie" } });
    }
}

通过上述配置,我们就实现了基于 URL 路径的 API 版本管理,并且每个版本都有独立的 OpenAPI 文档。

这里还使用了一个叫 Scalar 的库来生成 API 参考文档。Scalar 是一个专注于生成 API 参考文档的库,支持多版本文档生成和定制化配置。通过 Scalar,我们可以轻松地为每个 API 版本生成漂亮的参考文档,方便开发者查阅。

上一张 Scalar 的图(和本项目无关)
在这里插入图片描述

我把实验项目的代码放在了 GitHub 上,欢迎大家参考:
https://github.com/denglei1024/openapi-apiversion

如果这篇文章对你有帮助,欢迎点赞、在看、转发给更多 .NET 开发者 ❤️