Scalar.AspNetCore.Swashbuckle 深度指南:用 OpenAPI Filters 为 Swashbuckle 文档注入 Scalar 扩展

发布时间:2026/9/15 19:33:29

Scalar.AspNetCore.Swashbuckle 深度指南:用 OpenAPI Filters 为 Swashbuckle 文档注入 Scalar 扩展 Scalar.AspNetCore.Swashbuckle 深度指南用 OpenAPI Filters 为 Swashbuckle 文档注入 Scalar 扩展【免费下载链接】scalarScalar is an open-source API platform: Modern REST API Client Beautiful API References ✨ 1st-Class OpenAPI/Swagger Support项目地址: https://gitcode.com/GitHub_Trending/sc/scalarScalar.AspNetCore.Swashbuckle是 Scalar 开源 API 平台中面向 .NET 生态的官方集成包它的核心职责是为Swashbuckle.AspNetCore.SwaggerGen提供一组 OpenAPI Filters把 Scalar 特有的扩展稳定性标记、徽章、代码示例、端点隐藏写入你生成的 OpenAPI 文档中。读完本文你将掌握该包的安装与注册方式、全部扩展能力的用法Minimal API 与 Controller 两种写法、底层过滤器的实现原理以及如何用仓库内现成的测试用例验证输出结果。包定位在不改动业务代码的前提下增强 OpenAPI 文档Scalar 本身是一个开源的 API 平台既提供现代化的 REST API 客户端也提供漂亮的 API References 界面并对 OpenAPI/Swagger 有一流的支持。当你在 ASP.NET Core 应用里使用 Swashbuckle 生成 OpenAPI 文档、再用 Scalar.AspNetCore 渲染 Scalar 的 API Reference 界面时往往会希望文档中携带更多面向阅读者的语义信息——比如某个接口是 experimental 还是 stable、某个接口要打上 New 或 Beta 徽章、某个内部接口不要出现在参考文档里。这些需求正是Scalar.AspNetCore.Swashbuckle包的用武之地。其 README 对包定位的描述非常直接TheScalar.AspNetCore.Swashbucklepackage provides OpenAPI filters forSwashbuckle.AspNetCore.SwaggerGenthat enable Scalar-specific extensions in your OpenAPI document.也就是说该包不改变你的 API 实现而是通过 Swashbuckle 的 Filter 机制在文档生成阶段把 Scalar 扩展写入 OpenAPI 文档。从 Scalar.AspNetCore.Swashbuckle.csproj 可以看到它的依赖面很干净Microsoft.OpenApi、Swashbuckle.AspNetCore.SwaggerGen以及项目内引用Scalar.AspNetCore扩展属性与序列化辅助都来自该包。目标框架为net8.0;net9.0;net10.0适用于当前的 .NET 8/9/10 应用。安装与注册一条扩展方法接入全部 Filters首先通过 NuGet 安装包对应官方文档 openapi-extensions.md 中的说明dotnet add package Scalar.AspNetCore.Swashbuckle然后在 OpenAPI 注册阶段调用AddScalarFilters()扩展方法using Scalar.AspNetCore; var builder WebApplication.CreateBuilder(args); // Swashbuckle.AspNetCore.SwaggerGen builder.Services.AddSwaggerGen(options options.AddScalarFilters()); var app builder.Build(); app.MapOpenApi(); // 或 app.UseSwagger() 等 Swashbuckle 的文档暴露方式 app.Run();AddScalarFilters的实现位于 SwaggerGenOptionsExtensions.cs一次调用共注册了 1 个 DocumentFilter 和 4 个 OperationFilterpublic static SwaggerGenOptions AddScalarFilters(this SwaggerGenOptions options) { options.DocumentFilterExcludeFromApiReferenceDocumentFilter(); options.OperationFilterExcludeFromApiReferenceOperationFilter(); options.OperationFilterStabilityOpenApiOperationFilter(); options.OperationFilterCodeSampleOperationFilter(); options.OperationFilterBadgeOperationFilter(); return options; }各过滤器与对应扩展键的对应关系如下过滤器类型写入的扩展键作用StabilityOpenApiOperationFilterOperationFilterx-scalar-stability标记接口稳定性stable / experimental / deprecatedBadgeOperationFilterOperationFilterx-badges为操作添加视觉徽章CodeSampleOperationFilterOperationFilterx-codeSamples为操作添加自定义代码示例ExcludeFromApiReferenceOperationFilterOperationFilterx-scalar-ignore标记单个操作不出现在 API ReferenceExcludeFromApiReferenceDocumentFilterDocumentFilterx-scalar-ignore提升到 tag 级整组隐藏某个 tag 下的全部操作这些扩展键的常量定义集中在 ExtensionKeys.csScalarIgnore、ScalarStability、CodeSamples、Badges并通过 JsonSerializerHelper.cs 中的源生成序列化上下文以 camelCase 命名、忽略 null 值的方式写入 JSON。标记 API 稳定性x-scalar-stability稳定性信息帮助使用者判断一个接口是否适合投入生产。Scalar 定义了三个稳定性级别见 Stability.cs 与官方文档Stable生产就绪的 API序列化为stableExperimental可能随时变更、不建议生产使用的 API序列化为experimentalDeprecated将在未来版本移除的 API序列化为deprecatedMinimal API 写法app.MapGet(/products, GetProducts).Stable(); app.MapGet(/beta-features, GetBetaFeatures).Experimental(); app.MapGet(/legacy-endpoint, GetLegacyData).Deprecated();Controller 写法[HttpGet] [Stability(Stability.Stable)] public IActionResult GetProducts() Ok();Minimal API 一侧的Stable()/Experimental()/Deprecated()扩展方法定义在 EndpointConventionBuilderExtensions.cs它们内部都通过WithStability往 EndpointMetadata 中写入StabilityAttribute定义见 StabilityAttribute.cs。底层过滤器 StabilityOpenApiOperationFilter.cs 的读取逻辑值得注意// We use LastOrDefault because this allows a specific endpoint to override the stability var stabilityAttribute context.ApiDescription.ActionDescriptor.EndpointMetadata .OfTypeStabilityAttribute() .LastOrDefault();也就是说当你在分组MapGroup级别标记了稳定性、又在具体端点上再次标记时LastOrDefault保证端点级标记覆盖分组级标记。命中后过滤器把稳定性值序列化为x-scalar-stability扩展{ x-scalar-stability: experimental }这一输出被 StabilityFilterTests.cs 以 JSON 全量比对的方式验证测试覆盖了stable、experimental、deprecated三种取值。从 API Reference 中隐藏端点x-scalar-ignore有些内部端点你希望保留在 OpenAPI 文档供工具调用中但不想让它在 Scalar 的 API Reference 界面里出现。ExcludeFromApiReference正好解决这个需求且端点仍然可以正常访问。Minimal API 写法app.MapGet(/internal/metrics, GetMetrics).ExcludeFromApiReference();Controller 写法[HttpGet] [ExcludeFromApiReference] public IActionResult GetInternalMetrics() Ok();隐藏逻辑由两个过滤器协作完成ExcludeFromApiReferenceOperationFilter.cs 是 OperationFilter检测到ExcludeFromApiReferenceAttribute后给该操作加上x-scalar-ignore: trueExcludeFromApiReferenceDocumentFilter.cs 是 DocumentFilter它先把文档中所有操作按 tag 分组然后找出该 tag 下全部操作都带x-scalar-ignore的 tag把忽略标记提升到 tag 级别并移除操作上的冗余标记var tagsToExclude tagOperations.Where(kvp kvp.Value.All(operation operation.Extensions is not null operation.Extensions.ContainsKey(ScalarIgnore)));这样处理的好处是Scalar 渲染时只需要识别 tag 级标记即可整组隐藏文档结构也更干净。注意官方文档明确提示——被隐藏的端点仍然可以通过 API 访问只是不会出现在 API Reference 界面中。添加自定义代码示例x-codeSamples默认情况下Scalar 的 API Reference 会为每个操作自动生成多种语言的代码示例。如果你希望针对某个端点提供手写示例例如展示特定的鉴权头、特定的调用方式可以用CodeSample覆盖或补充。Minimal API 写法app.MapPost(/orders, CreateOrder) .CodeSample(fetch(/orders, { method: POST, body: JSON.stringify(order) }), ScalarTarget.JavaScript, Create Order) .CodeSample(curl -X POST /orders -d order.json, ScalarTarget.Shell, Create with cURL);Controller 写法[HttpGet] [CodeSample(fetch(/products).then(r r.json()), ScalarTarget.JavaScript)] public IActionResult GetProducts() Ok();CodeSampleAttribute见 CodeSampleAttribute.cs有三个构造参数sample示例代码内容、languageScalarTarget枚举如ScalarTarget.CSharp、ScalarTarget.JavaScript、ScalarTarget.Shell、label可选标签并且AllowMultiple true一个端点可以挂多个示例。Minimal API 侧对应的扩展方法是 EndpointConventionBuilderExtensions.cs 中的CodeSample。CodeSampleOperationFilter.cs 会把端点元数据中的所有CodeSampleAttribute批量收集为CodeSample数据模型写入x-codeSamples扩展{ x-codeSamples: [ { source: fetch(/orders, { method: POST, body: JSON.stringify(order) }), label: Create Order, language: javascript } ] }添加视觉徽章x-badges徽章用于在 API Reference 界面上给操作附加醒目的视觉标识比如 New、Beta、Internal。每个操作可以挂多个徽章并分别配置位置与颜色。Minimal API 写法app.MapGet(/alpha-feature, GetAlphaFeature) .WithBadge(Alpha) .WithBadge(Beta, BadgePosition.Before) .WithBadge(Internal, BadgePosition.After, #ff6b35); app.MapPost(/orders, CreateOrder) .WithBadge(New, color: #28a745) .WithBadge(Premium, BadgePosition.Before, #ffc107);Controller 写法[HttpGet] [Badge(New)] [Badge(V2, BadgePosition.After, #007bff)] public IActionResult GetExperimentalFeature() Ok();徽章的可配置项官方文档 openapi-extensions.md 与 BadgeAttribute.cs 均有说明参数必填说明name是徽章上显示的文本position否徽章相对操作标题的位置BadgePosition.After默认/BadgePosition.Beforecolor否徽章颜色支持任意 CSS 颜色格式hex、rgb、颜色关键字等BadgePosition枚举定义在 BadgePosition.cs序列化时分别输出为after/before。BadgeOperationFilter.cs 会收集端点上的全部BadgeAttribute同样AllowMultiple true写入x-badges扩展。仓库测试 BadgeFilterTests.cs 给出了非常直观的期望输出——当分组级挂了 Alpha 徽章、端点级又挂了 Betabefore、Gammaafter 颜色、Delta仅颜色时生成的 JSON 为x-badges: [ { name: Alpha }, { name: Beta, position: before }, { name: Gamma, position: after, color: #ffcc00 }, { name: Delta, color: #00ff00 } ]可见分组级徽章会自动继承到组内每个操作上这也是为什么一个操作可能同时包含来自分组和自身两部分的徽章。已弃用端点的处理除了x-scalar-stability: deprecated这种标记方式仓库中还提供了一个专门处理DeprecatedAttribute的过滤器 DeprecatedEndpointFilter.cs。它读取Scalar.AspNetCore.Attributes.DeprecatedAttribute见 DeprecatedAttribute.cs可传入可选参数reason说明弃用原因或新接口指引然后将operation.Deprecated置为true对应 OpenAPI 标准的deprecated字段若提供了reason则把它追加到操作的Description中。需要说明的是从源码结构看AddScalarFilters当前并未注册该过滤器仓库中已注册的是稳定性、徽章、代码示例和隐藏端点这五个过滤器。如果你希望启用原因描述式的弃用标注可以按需自行通过options.OperationFilter...()注册或优先使用[Stability(Stability.Deprecated)]/.Deprecated()的稳定性路径。底层实现剖析一套统一的元数据读取模式把五个过滤器放在一起看会发现它们遵循完全一致的实现模式这也是本包易于理解和扩展的原因从 EndpointMetadata 读取特性所有过滤器都通过context.ApiDescription.ActionDescriptor.EndpointMetadata.OfTypeTAttribute()从端点元数据中取出对应特性——Minimal API 的.WithBadge(...)/.CodeSample(...)扩展方法最终调用builder.WithMetadata(new XxxAttribute(...))见 EndpointConventionBuilderExtensions.csController 则直接使用[Xxx]特性两条路径殊途同归最终都落在 EndpointMetadata 上按需初始化扩展集合operation.Extensions ?? new Dictionarystring, IOpenApiExtension();确保不覆盖已有扩展幂等写入使用Extensions.TryAdd(...)避免重复注入同一个扩展键统一序列化JsonSerializerHelper.cs 使用System.Text.Json的源生成上下文ScalarExtensionsSerializerContext序列化CodeSample、Badge、Stability等模型并统一配置 camelCase 命名与 null 值忽略保证输出的扩展 JSON 风格一致。这种特性Attribute声明 Filter 消费的设计让所有扩展能力都可以同时工作在 Minimal API、Controller 与最小化 API 的各种托管模型上且不需要修改任何业务实现代码。测试与验证仓库如何保证扩展输出正确Scalar.AspNetCore.Swashbuckle的每个过滤器都有对应的集成测试位于 integrations/dotnet/aspnetcore/tests/Scalar.AspNetCore.Swashbuckle.Tests包括BadgeFilterTests.cs验证x-badges的完整 JSON 结构StabilityFilterTests.cs验证x-scalar-stability三种取值CodeSampleFilterTests.cs验证x-codeSamples的注入ExcludeFromApiReferenceFilterTests.cs验证x-scalar-ignore的隐藏逻辑。测试的写法很有参考价值它们通过WebApplicationFactoryConfigureTestServices注册AddScalarFilters动态搭建路由含MapSwagger、MapGroup、端点级与分组级的特性组合再请求生成的 OpenAPI JSON 与期望输出做全量匹配。如果你在自己的项目中接入本包完全可以把这些测试当作行为契约快速确认扩展输出的精确格式。快速上手参考一个完整的 Minimal API 接入示例综合了分组级与端点级扩展参考仓库 playground 的 BookEndpoints.cs 与 Program.csusing Scalar.AspNetCore; var builder WebApplication.CreateBuilder(args); builder.Services.AddSwaggerGen(options options.AddScalarFilters()); builder.Services.AddOpenApi(); var app builder.Build(); app.MapOpenApi(); app.MapScalarApiReference(); // 挂载 Scalar API Reference 界面 var books app.MapGroup(/books).WithTags(bookstore); books.MapGet(/, () Results.Ok()).Stable(); books.MapGet(/{id}, (Guid id) Results.Ok()).Experimental() .WithBadge(Beta, BadgePosition.Before, #ffcc00); books.MapDelete(/{id}, (Guid id) Results.NoContent()) .WithBadge(Caution, BadgePosition.Before, #ffc2c2); app.Run();至此你的 Swashbuckle 文档中就会自动携带x-scalar-stability、x-badges、x-codeSamples、x-scalar-ignore等 Scalar 扩展Scalar API Reference 界面将据此渲染出带稳定性标识、徽章、自定义代码示例且过滤掉内部端点的文档体验。想要进一步查阅各扩展的完整能力与属性说明可以对照 openapi-extensions.md 文档并结合本文提到的过滤器源码逐一验证。【免费下载链接】scalarScalar is an open-source API platform: Modern REST API Client Beautiful API References ✨ 1st-Class OpenAPI/Swagger Support项目地址: https://gitcode.com/GitHub_Trending/sc/scalar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/15 19:33:29

WindTerm文件上传功能详解与高效使用技巧

1. WindTerm文件上传功能深度解析WindTerm作为一款现代化的终端工具,其文件传输功能在日常开发运维工作中扮演着重要角色。不同于传统FTP客户端或SCP命令的繁琐操作,WindTerm内置的图形化文件传输界面让跨系统文件交换变得直观高效。我在实际使用中发现&…

2026/9/15 19:58:30

dotnet/skills升级插件六大技能清单:.NET版本升级路线图

dotnet/skills升级插件六大技能清单:.NET版本升级路线图 【免费下载链接】skills Repository for skills to assist AI coding agents with .NET and C# 项目地址: https://gitcode.com/GitHub_Trending/skills17/skills 对于正在维护 .NET 项目的开发者来说…

2026/9/15 19:58:30

Reactive Resume 简历导出指南:四格式下载与避坑

Reactive Resume 简历导出指南:四格式下载与避坑 【免费下载链接】reactive-resume A one-of-a-kind resume builder that keeps your privacy in mind. Completely secure, customizable, portable, open-source and free forever. Try it out today! 项目地址: …

2026/9/15 19:58:30

Keil 5安装教程:C51与MDK共存完整指南

作为一个常年跟单片机打交道的人,我太清楚Keil这个开发环境的脾气了。很多刚入门的朋友下载了安装包,一路狂点下一步,结果要编译51单片机程序时发现编译器不对,等要搞STM32时又发现设备支持包缺失,最后只能在知乎和CSD…

2026/9/15 19:53:30

大模型核心技术解析:5个关键概念与应用实践

1. 大模型入门:为什么这5个概念如此重要?最近两年,大模型技术以惊人的速度渗透到各个领域。作为一名长期跟踪AI技术发展的从业者,我经常被问到:"大模型到底是什么?为什么它突然变得这么重要&#xff1…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码