首页
/ ASP.NET API Versioning 项目中 Swagger.json 文件未找到问题的分析与解决

ASP.NET API Versioning 项目中 Swagger.json 文件未找到问题的分析与解决

2025-06-26 11:50:40作者:董宙帆

问题背景

在 ASP.NET Core 项目中,当开发者使用 ASP.NET API Versioning 库进行 API 版本管理时,可能会遇到 Swagger UI 无法加载 swagger.json 文件的问题。具体表现为:升级到 8.1.0 版本后,Swagger 页面能够正常加载 index.html,但无法获取 swagger.json 文件,返回 "Not Found /swagger/v1/swagger.json" 错误。

问题现象

开发者在使用 8.0.0 版本时一切正常,但在升级到 8.1.0 版本后出现以下情况:

  1. Swagger UI 页面能够正常加载
  2. 页面显示 "Fetch error Not Found /swagger/v1/swagger.json"
  3. 控制台无任何错误信息输出
  4. API 本身通过 Postman 测试工作正常

配置分析

典型的 API Versioning 配置如下:

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

Swagger 配置通常为:

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    var descriptions = app.DescribeApiVersions();
    foreach (var description in descriptions)
    {
        c.SwaggerEndpoint(
            $"/swagger/{description.GroupName}/swagger.json",
            description.GroupName.ToUpperInvariant()
        );
    }
});

问题根源

经过排查,发现问题出在 Minimal API 的端点配置上。在 8.1.0 版本中,当使用 WithGroupName 方法为端点组指定名称时,会导致 Swagger 文档生成失败。

具体来说,以下代码片段中的 WithGroupName 调用是问题的根源:

var group = app.MapGroup(Routes.Personnel.MainUrl)
    .RequireAuthorization()
    .UseValidateOrganization(onlyOwner: false)
    .UseCheckMembership(needOrganizationInfo: true)
    .WithGroupName(Routes.Personnel.Group);  // 问题所在

解决方案

解决此问题的方法很简单:移除 WithGroupName 方法的调用即可。

修改后的代码应为:

var group = app.MapGroup(Routes.Personnel.MainUrl)
    .RequireAuthorization()
    .UseValidateOrganization(onlyOwner: false)
    .UseCheckMembership(needOrganizationInfo: true);

技术原理

在 ASP.NET API Versioning 8.1.0 版本中,WithGroupName 方法与 Swagger 文档生成机制存在兼容性问题。API Versioning 本身已经提供了版本分组机制,通过 GroupNameFormat 配置项(如 "'v'V")自动为不同版本的 API 创建分组。手动指定组名可能会干扰这一机制。

最佳实践建议

  1. 版本升级注意事项:在升级 API Versioning 版本时,应仔细测试 Swagger 集成部分,特别是文档生成功能。

  2. 分组命名策略:优先使用 API Versioning 提供的自动分组机制,而非手动指定组名。

  3. 调试技巧:当 Swagger 文档无法生成时,可以:

    • 逐步注释掉端点配置,定位问题端点
    • 检查控制台输出和调试窗口的异常信息
    • 确保所有端点都正确关联到版本组
  4. Minimal API 配置:对于 Minimal API,确保版本集配置正确:

var apiVersionSet = app.NewApiVersionSet()
    .HasApiVersion(new ApiVersion(1, 0))
    .ReportApiVersions()
    .Build();

var versionedGroup = app.MapGroup($"api/v{version:apiVersion}")
    .WithApiVersionSet(apiVersionSet);

总结

ASP.NET API Versioning 是一个强大的 API 版本管理工具,但在与 Swagger 集成时可能会遇到文档生成问题。本文分析的案例展示了在 8.1.0 版本中 WithGroupName 方法导致的问题及解决方案。开发者在使用时应遵循官方推荐的分组策略,并在遇到问题时采用系统化的调试方法定位问题根源。

登录后查看全文
热门项目推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
261
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
860
511
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
259
300
kernelkernel
deepin linux kernel
C
22
5
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
596
57
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K