#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 });
}