跳到主要内容
版本:3.0.0

Swagger

Swagger 这一页别想复杂。
对大多数项目来说,它主要解决两件事:

  • 生成接口文档
  • 提供一个可以直接调接口的页面

它不负责替你补接口注释,也不负责自动生成项目 XML 文件。
所以想让 Swagger 正常工作,至少要有三样东西:

  • Component.deps.json
  • Swagger 配置节
  • 项目 XML 注释输出

最小接入方式

1. 在 Component.deps.json 中启用 Swagger

{
"Components": {
"Services": [
"Swagger"
],
"Middlewares": [
"Swagger"
]
}
}

2. 在配置文件里加上 Swagger 节点

{
"Swagger": {
"IsEnabled": true,
"Title": "Aegis Demo",
"Version": "v1",
"XmlCommentsPath": "{CurrentDirectory}/{CurrentProject}.xml",
"ExtensionXmlComments": [
"{CurrentDirectory}/*.Dto.xml"
],
"SecurityScheme": {
"SecurityEnabled": true,
"AddBearerHeader": true,
"BearerName": "Authorization",
"Description": "Value Bearer {token}"
}
}
}

3. 开启项目 XML 注释输出

<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>

4. 启动后打开 /swagger/index.html

页面能打开、接口能看到、需要认证时也有按钮,基本就说明通了。

两个最常见的场景

只给当前启动项目生成文档

{
"Swagger": {
"IsEnabled": true,
"Title": "My API",
"Version": "v1",
"XmlCommentsPath": "{CurrentDirectory}/{CurrentProject}.xml"
}
}

适合:

  • 控制器、请求对象、返回对象都主要在当前项目里
  • 先把 Swagger 页面跑起来

同时合并 DTO 或共享类库注释

{
"Swagger": {
"IsEnabled": true,
"Title": "My API",
"Version": "v1",
"XmlCommentsPath": "{CurrentDirectory}/{CurrentProject}.xml",
"ExtensionXmlComments": [
"{CurrentDirectory}/*.Dto.xml",
"{CurrentDirectory}/Aegis.Transfer.xml"
]
}
}

适合:

  • DTO 不在启动项目里
  • 公共返回对象或枚举定义在独立类库里

需要认证时怎么调

如果接口需要认证,建议把安全头定义一并打开。

{
"Swagger": {
"SecurityScheme": {
"SecurityEnabled": true,
"AddBearerHeader": true,
"BearerName": "Authorization",
"Description": "Value Bearer {token}"
}
}
}

通常就是这几步:

  1. 先通过登录接口拿到 token
  2. 点击 Swagger UI 里的认证按钮
  3. 按页面说明填写值
  4. 再调用受保护接口

什么时候再补 ExtensionXmlComments

遇到下面这些情况,再补它最合适:

  • 页面里只有控制器说明,没有字段说明
  • 模型显示出来了,但枚举注释缺失
  • DTO 和 Contract 不在启动项目

常见问题

为什么已经启用组件,但浏览器里没有 Swagger 页面

先查这几项:

  1. Services 是否包含 Swagger
  2. Middlewares 是否包含 Swagger
  3. Swagger:IsEnabled 是否为 true

为什么启动时报 XML 文件不存在

通常是这几个原因:

  • 项目没有开启 XML 输出
  • 路径写错
  • 发布时 XML 没有进入运行目录

为什么 Swagger 页面有接口,但没有注释

大多数情况下就是 XML 文件没有正确生成或加载。
如果主项目有注释、DTO 没注释,通常再补 ExtensionXmlComments 就能解决。

为什么 Swagger 里没有认证按钮

先检查 SecurityScheme.SecurityEnabled 是否开启。
再检查 BearerName 是否和你们实际使用的请求头名称一致。

继续看哪里

  1. Swagger 文档扩展(Aegis.Extensions.Swagger)
  2. 认证和鉴权体系
  3. Controller