微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swashbuckle v5.5.3 中的 IOperation 过滤器更改

如何解决Swashbuckle v5.5.3 中的 IOperation 过滤器更改

我尝试将两个自定义 MediaType 添加到同一方法。 为了添加这个任务,我们可以使用 [Produces()] 属性,但是如果我们想在同一个控制器中有两个 GET 方法,我们会在 swagger 中得到这个错误

SwaggerGeneratorException:冲突的方法/路径组合“GET api/authors/{authorId}/books/{bookId}”用于操作 - Library.API.Controllers.BooksController.GetBook (Library.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 中使用这个代码

请帮我解决这个问题

解决方法

我替换此代码并解决了我的问题。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。