【问题标题】:Swashbuckle SwaggerResponseRemoveDefaults attribute still adding 200 Success response to SwaggerSwashbuckle SwaggerResponseRemoveDefaults 属性仍然向 Swagger 添加 200 Success 响应
【发布时间】:2020-06-08 04:28:40
【问题描述】:

我在 .NET Core 3.1 项目中使用 Swashbuckle 和 Swagger UI,并将我的 XML cmets 导入 Swagger。我在控制器上有一个 POST 请求,我想在 Swagger 中注册多个响应状态(201、401、403、404)。问题是我还在 swagger.json 文件和 Swagger UI 界面中看到与我明确指定的状态代码响应一起列出的 200 Success 响应。

正如在多个不同的地方所建议的那样,我正在使用 [SwaggerResponseRemoveDefaults] 属性来尝试防止这种情况发生,但是我尝试的所有操作仍然会导致列出默认的 200 响应。

我试过了:

  • 将属性添加到方法中,
  • 将属性添加到控制器,
  • 将属性添加到抽象基控制器,

以及以上所有组合。我也尝试过结合这些:

  • 使用 XML <response code="XXX"></response> 注释标签指定所需的响应类型,以及
  • 使用[SwaggerResponse(XXX)] 端点指定所需的响应类型。

没有任何结果导致从我的 Swagger UI 和 swagger.json 中删除 200 Success 结果。

TrackerController.cs

/// <summary>...</summary>
/// <response code="401">User is not authenticated.</response>
/// <response code="404">Tracker not found.</response>
[Authorize]
[ApiController]
[Route("[controller]")]
[SwaggerResponseRemoveDefaults]
public partial class TrackersController : AbstractController
{
    ...

    /// <summary>...</summary>
    /// <param name="tracker">The details of the tracker to be created.</param>
    /// <response code="201">The tracker was successfully created.</response>
    /// <response code="403">User is not authorized to modify this resource.</response>
    [HttpPost]
    [SwaggerResponseRemoveDefaults]
    [ResponseType(typeof(TrackerDto))]
    [SwaggerResponse(201, Description = "The tracker was successfully created.")]
    public async Task<IActionResult> CreateTracker([FromBody] TrackerDto tracker)
    {
        ...
    }

    ...

}

swagger.json

{
  "openapi": "3.0.1",
  "info": {
    "title": "My API",
    "version": "v1"
  },
  "paths": {
    "/Trackers": {
      "post": {
        "tags": [
          "Trackers"
        ],
        "summary": "Create a new tracker.",
        "requestBody": {
          "description": "The details of the tracker to be created.",
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/TrackerDto"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TrackerDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TrackerDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TrackerDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success"
          },
          "201": {
            "description": "The tracker was successfully created."
          },
          "401": {
            "description": "User is not authenticated."
          },
          "403": {
            "description": "User is not authorized to modify this resource."
          },
          "404": {
            "description": "Tracker not found."
          }
        }
      }
    }
  }
}

Swagger UI Screenshot

【问题讨论】:

    标签: c# swagger swashbuckle .net-core-3.1 swagger-3.0


    【解决方案1】:

    现在,您告诉 Swagger 您正在生成一个默认类型为 200 TrackerDto,此外另一个响应为 201。您需要将其 设为一个 em> 匹配对。

    删除ResponseType 属性并将类型放在它所属的位置:

    [SwaggerResponse(201, Description = "The tracker was successfully created.", typeof(TrackerDto))]
    

    你也可以试试:

    [ProducesResponseType(typeof(TrackerDto), 201)]
    

    重要的是将类型和状态码放在同一个属性中,这样 Swagger 就知道它们属于同一类。

    【讨论】:

    • 试过了,但这也没有解决 - 我有另一个测试控制器方法,它被简化为最简单的场景:没有抽象基本控制器,没有 [Authorize] 属性,只有响应类型的 XML 注释 &lt;response code="XXX"&gt;&lt;/response&gt; 标记和 [SwaggerResponseRemoveDefaults] 属性仍然不会删除 200 Success 响应。
    • 您能否尝试删除 everything、所有其他属性和 cmets(可能除了 HTTP 动词和 AllowAnonymous),然后只使用答案中的选项之一吗?
    • 由于某种原因,SwaggerResponse 属性没有被 Swashbuckle 为我拾取,但我可以确认 [ProducesResponseType(typeof(TrackerDto), 201)] 方法确实删除了默认的 200 Success 响应从列表中。要添加响应类型的描述,我也只是使用 XML 注释文档,它将两者链接在一起。
    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2023-03-18
    相关资源
    最近更新 更多