# Swagger
Air.Cloud.Plugins.SpecificationDocument 是 Air.Cloud 的 Swagger / OpenAPI 文档插件。它基于 Swashbuckle 生成 Swagger JSON 和 Swagger UI,同时注册 SwaggerAPIProbeProvider,让 APICatalog 可以从 Swagger 文档转换出 APIProbeResult。
# 包名
Air.Cloud.Plugins.SpecificationDocument
# 启用条件
插件是否生效取决于 AppSettings:InjectSpecificationDocument:
- 非生产环境默认
true。 - 生产环境默认
false。
显式开启:
{
"AppSettings": {
"InjectSpecificationDocument": true
}
}
插件启动类会自动执行:
services.AddSpecificationDocuments();
services.WebSpecificationDocumentInject();
app.UseSwaggerDocumentPlugin();
也可以在业务项目中手动调用:
using Air.Cloud.Plugins.SpecificationDocument.Extensions;
builder.Services.AddSpecificationDocuments(options =>
{
options.SwaggerGenConfigure = swaggerGen =>
{
// 自定义 SwaggerGenOptions
};
});
var app = builder.Build();
app.UseSwaggerDocumentPlugin(configure: options =>
{
options.SpecificationDocumentConfigure = document =>
{
document.SwaggerUIConfigure = swaggerUI =>
{
// 自定义 SwaggerUIOptions
};
};
});
# 配置项
配置节:SpecificationDocumentSettings
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
DocumentTitle | string | Specification Api Document | Swagger UI 页面标题。 |
DefaultGroupName | string | Default | 默认文档分组。 |
EnableAuthorized | bool? | true | 是否生成授权安全定义。 |
FormatAsV2 | bool? | false | 是否按 Swagger V2 格式输出。 |
RoutePrefix | string | null | Swagger UI 路径前缀;为空时可使用传入的 routePrefix。 |
DocExpansionState | DocExpansion? | List | Swagger UI 展开状态。 |
XmlComments | string[] | 当前应用程序集 XML | XML 注释文件列表。 |
GroupOpenApiInfos | SpecificationOpenApiInfo[] | 默认分组 | 分组 OpenAPI 信息。 |
SecurityDefinitions | SpecificationOpenApiSecurityScheme[] | Bearer JWT | 安全定义。 |
Servers | OpenApiServer[] | [] | OpenAPI servers。 |
HideServers | bool? | true | 是否隐藏 servers。 |
RouteTemplate | string | swagger/{documentName}/swagger.json | Swagger JSON 路由模板。 |
PackagesGroups | string[] | [] | 第三方包分组配置。 |
EnableEnumSchemaFilter | bool? | true | 是否启用枚举 Schema 处理。 |
EnableTagsOrderDocumentFilter | bool? | true | 是否启用标签排序 DocumentFilter。 |
ServerDir | string | null | 服务目录,用于修正 IIS Application 场景路径。 |
LoginInfo | SpecificationLoginInfo | null | Swagger UI 登录配置。 |
EnableAllGroups | bool? | false | 是否启用 All Groups 聚合分组。 |
示例:
{
"AppSettings": {
"InjectSpecificationDocument": true
},
"SpecificationDocumentSettings": {
"DocumentTitle": "Air.Cloud API",
"DefaultGroupName": "Default",
"RoutePrefix": "swagger",
"RouteTemplate": "swagger/{documentName}/swagger.json",
"EnableAuthorized": true,
"EnableAllGroups": false,
"HideServers": true
}
}
# 分组与 ApiDescriptionSettings
SpecificationDocument 会按接口分组生成 Swagger 文档。WebApp 动态 API 常用 ApiDescriptionSettingsAttribute 标记分组和排序:
using Air.Cloud.WebApp.DynamicApiController.Attributes;
[ApiDescriptionSettings("User", Tag = "用户", Order = 10)]
public sealed class UserAppService
{
[ApiDescriptionSettings("User", Description = "查询用户详情", Order = 20)]
public UserDto GetUser(long id)
{
return new UserDto();
}
}
插件当前会读取 ApiDescriptionSettingsAttribute.Order 做 Action 排序,并通过 Swagger Tag / Group 展示接口目录。
# SchemaIdAttribute
插件提供 SchemaIdAttribute,用于显式指定模型在 Swagger Schema 中的名称,避免同名类型冲突或泛型名称过长。
using Air.Cloud.Plugins.SpecificationDocument.Attributes;
[SchemaId("UserDto")]
public sealed class UserResponse
{
public string Name { get; set; }
}
# 授权定义
EnableAuthorized=true 时,默认生成 Bearer JWT 安全定义:
Id:BearerType:HttpScheme:bearerBearerFormat:JWTIn:HeaderName:Authorization
如果业务需要替换安全定义,可以配置 SecurityDefinitions。
# OperationFilter 自动注入
WebSpecificationDocumentInject() 会扫描实现 IOperationFilter 的类型,并注册到 SwaggerGenOptions。适合把接口文档扩展逻辑放在独立过滤器里。
# SwaggerAPIProbeProvider
SpecificationDocument 会注册 SwaggerAPIProbeProvider:
services.TryAddEnumerable(
ServiceDescriptor.Singleton<IAPIProbeProvider, SwaggerAPIProbeProvider>());
该 Provider 的名称是 Swagger,APICatalog 可以这样读取 Swagger 来源的 APIProbe 文档:
GET /api-probe?provider=Swagger
SwaggerAPIProbeProvider 会把 OpenAPI 文档转换为:
APIProbeEndpointAPIProbeRequestAPIProbeResponseAPIProbeSchema
如果只需要框架标准 API 目录,优先使用 APICatalog 默认的 ApiExplorer Provider;如果需要以 Swagger/OpenAPI 为来源,再使用 provider=Swagger。
# 常见问题
# Swagger 页面没有启用
检查:
AppSettings:InjectSpecificationDocument是否为true。- 是否引用了
Air.Cloud.Plugins.SpecificationDocument。 - 是否调用了
AddSpecificationDocuments()和UseSwaggerDocumentPlugin()。
# 生产环境没有 Swagger
这是默认行为。生产环境 InjectSpecificationDocument 默认 false,需要显式开启。
# APICatalog 读取不到 Swagger Provider
确认:
- SpecificationDocument 已启用。
AddSpecificationDocuments()已执行。- 请求使用
GET /api-probe?provider=Swagger。
← JWT 网络穿透(AirTunnel) →