Атрибут Swashbuckle SwaggerResponseRemoveDefaults по-прежнему добавляет 200 ответа Success для Swagger

Я использую Swashbuckle и Swagger UI в проекте .NET Core 3.1, а мои XML-комментарии импортированы в Swagger. У меня есть запрос POST на контроллере, для которого я хочу зарегистрировать несколько статусов ответа (201, 401, 403, 404) в Swagger. Проблема в том, что я также вижу ответ 200 Success, указанный рядом с моими явно указанными ответами с кодом состояния в файле swagger.json и интерфейсе пользовательского интерфейса Swagger.

Как было предложено в нескольких разных местах, я использую атрибут [SwaggerResponseRemoveDefaults], чтобы попытаться предотвратить это, однако все, что я пробую, по-прежнему приводит к отображению ответа по умолчанию 200.

Я пробовал:

  • добавление атрибута в метод,
  • добавление атрибута в контроллер,
  • добавление атрибута к абстрактному базовому контроллеру,

и все комбинации вышеперечисленного. Я также пробовал их в сочетании с:

  • указание желаемых типов ответов с помощью тегов комментариев XML <response code="XXX"></response>, и
  • указание желаемых типов ответа с [SwaggerResponse(XXX)] конечными точками.

Ничто не приводит к удалению результата 200 Success из моего пользовательского интерфейса Swagger и swagger.json.

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


person Sam W    schedule 24.02.2020    source источник


Ответы (1)


Прямо сейчас вы сообщаете Swagger, что вы создаете TrackerDto с типом по умолчанию 200 и вдобавок еще один ответ 201. Вам нужно создать эту одну единственную совпадающую пару.

Отбросьте атрибут ResponseType и поместите тип, которому он принадлежит:

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

Вы также можете попробовать:

[ProducesResponseType(typeof(TrackerDto), 201)]

Важно поместить тип и код состояния в один и тот же атрибут, чтобы Swagger знал, что они принадлежат друг другу.

person nvoigt    schedule 24.02.2020
comment
Пробовал это, и это тоже не помогло - у меня есть другой метод тестового контроллера, который урезан до простейшего возможного сценария: без абстрактного базового контроллера, без атрибутов [Authorize], только теги комментариев XML <response code="XXX"></response> для типов ответов и [SwaggerResponseRemoveDefaults] атрибут все еще не удаляет ответ 200 Success. - person Sam W; 24.02.2020
comment
Можете ли вы попробовать отбросить все, все остальные атрибуты и комментарии (кроме, может быть, HTTP-глагола и AllowAnonymous) и просто использовать один из вариантов ответа, пожалуйста? - person nvoigt; 24.02.2020
comment
По какой-то причине Swashbuckle не подбирает атрибуты SwaggerResponse для меня, но я могу подтвердить, что подход [ProducesResponseType(typeof(TrackerDto), 201)] действительно удаляет ответ по умолчанию 200 Success из списка. Чтобы добавить описание типов ответов, я просто использую документы XML-комментариев, которые связывают их вместе. - person Sam W; 24.02.2020