Замена фильтра ввода-вывода в Swashbuckle v5.5.3

#asp.net #swagger #swashbuckle #swashbuckle.aspnetcore

#asp.net #развязность #swashbuckle #удалец.aspnetcore

Вопрос:

Я пытаюсь добавить два пользовательских медиатипа к одному и тому же методу. для добавления этой задачи мы можем использовать атрибут [Products()] , но если мы хотим иметь два метода GET в одном контроллере, мы получаем эту ошибку в swagger

Исключение SwaggerGeneratorException: конфликтующая комбинация метода / пути «GET api/authors/{AuthorID}/books/{BookID}» для actions — Library.API.Controllers.BooksController.getBook (Библиотека.API), Library.API.Controllers.BooksController.GetBookWithConcatenatedAuthorName (Library.API). Для действий требуется уникальная комбинация метода / пути для Swagger / OpenAPI 3.0. Используйте ConflictingActionsResolver в качестве обходного пути

в Swashbuckle v5 beta мы можем использовать этот IOperationFilter и добавить пользовательскую схему MediaType и использовать этот код

  public class GetBookOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (operation.OperationId != "GetBook")
        {
            return;
        }

        operation.Responses[StatusCodes.Status200OK.ToString()].Content.Add(
            "application/vnd.marvin.bookwithconcatenatedauthorname json",
            new OpenApiMediaType()
            {
                Schema = context.SchemaRegistry.GetOrRegister(typeof(BookWithConcatenatedAuthorName))
            });
    }
}
 

но мы не можем использовать этот код в Swashbuckle v5.6.3

пожалуйста, помогите мне решить эту проблему

Ответ №1:

Я повторил этот код и решил свою проблему.

 if (context.ApiDescription.ActionDescriptor.RouteValues["action"] != "GetBook")
            {
                return;
            }

        var schema = context.SchemaGenerator.GenerateSchema(typeof(BookWithConcatenatedAuthorName), context.SchemaRepository);
       
            if (operation.Responses.Any(a=> a.Key==StatusCodes.Status200OK.ToString()))
            {
            operation.Responses[StatusCodes.Status200OK.ToString()].Content.Add(
                "application/vnd.marvin.bookwithconcatenatedauthorname json",
                new OpenApiMediaType() { Schema = schema });
            }