Skip to content
bitzorcas
中EN

Reference

现代 API 文档与零反射生成:OpenAPI 3.1 + Scalar

告别沉重低效的 Swashbuckle 运行时反射!深入解析 BitzOrcas.Modern 编译期 OpenAPI 3.1 元数据提取与 Scalar 交互式现代 API 文档客户端。

Last updated

传统的 Swagger / Swashbuckle 在 .NET 现代企业架构中面临两大硬伤:

  1. 启动性能断崖式下跌:在服务启动时通过昂贵的运行时反射扫描上千个控制器和 DTO,导致冷启动耗时增加数秒;
  2. Native AOT 严重不兼容:反射扫描在 AOT 裁剪模式下极易丢失关键类型元数据,引发运行时崩溃。

BitzOrcas.Modern 采用 .NET 10 原生 Microsoft.AspNetCore.OpenApi + Scalar 现代交互客户端:所有端点元数据由 [GenerateEndpoint] 在编译期提取,启动 0 反射,呈现极致丝滑的现代化 API 调试界面。

编译期 OpenAPI 提取与 Scalar 渲染

1. [GenerateEndpoint] 契约属性

2. Roslyn Source Generator (编译期零反射)

3. Minimal API Route Mappings

4. ASP.NET Core 原生 OpenAPI 3.1 文档

5. Scalar 现代化交互式 API 调试控制台 (/scalar/v1)


第一步:声明式端点契约

只需要在 Command 或 Query 上标注 [GenerateEndpoint]:

GetTicketByIdQuery.cs: 声明 OpenAPI 路由与描述
using BitzOrcas.Application.Abstractions;
using BitzOrcas.Domain.Results;
using BitzOrcas.Endpoint.Attributes;
using Mediator;
namespace BitzOrcas.Ticket.Application.Queries;
// 1. 声明式端点契约:由 Source Generator 在编译期自动提取 OpenAPI 元数据
// 2. 自动生成 Minimal API 端点与 Scalar 调试界面映射
[GenerateEndpoint(HttpRoute.Get, "/api/tickets/{id}", Tag = "Tickets")]
public sealed record GetTicketByIdQuery(string Id) : IQuery<Result<TicketDetailsDto>>;

第二步:在 Host 中启用 Scalar 交互式客户端

在 Program.cs 中开启标准端点映射:

Program.cs: 启用 OpenAPI 与 Scalar
// 1. 注册原生 OpenAPI 3.1 文档生成器
builder.Services.AddBitzOrcasOpenApiDocumentation(); // 标题来自 OpenApi 配置节;框架包装而非裸 AddOpenApi
var app = builder.Build();
// 是否启用由 OpenApiDocumentationOptions.IsEnabledFor(env) 与 OpenApi:Enabled /
// OpenApi:RequireAuthentication 决定,可匿名开放或以文档会话 Cookie 把门;
// 固定 Modern 布局并注入 Nonce,不使用 ScalarTheme.Moon 这类裸参数。
app.MapBitzOrcasOpenApiDocumentation();

平台宿主监听 http://localhost:6881(HTTPS 6883)。Development 环境访问 http://localhost:6881/scalar/v1 即可打开自带请求测试的 API 控制台;其他环境由 OpenApi:Enabled 显式打开,OpenApi:RequireAuthentication=true 时以文档会话 Cookie 把门,未配置时进程拒绝启动。


总结

OpenAPI + Scalar 为 BitzOrcas 提供了顶尖的 API 交互体验:

  • AOT 零反射:毫秒级极速冷启动;
  • OpenAPI 3.1 完整规范:支持复杂 Schema 与强类型枚举;
  • 现代化 Scalar UI:颜值高、响应快、自带丰富代码生成片段。

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%