从ASP.Net Core OData项目中Swashbuckle生成的Swagger架构中排除某些模型

问题描述 投票:0回答:1

我正在使用Swashbuckle为我的ASP.Net Core 3.1 OData项目生成Swagger文档。

控制器方法的生成是完美的。它可以根据模型正确生成模式,除了以下几点:

对于模式中的每个模型,它还会生成一个附加的[ModelName]IQueryableODataValue条目,如下面的屏幕快照所示:

swagger doc screenshot

蓝色复选标记指示型号。用红色圈起来的模型条目是多余的条目,也正在添加。

注意,它也在生成Void模型,也用红色圆圈圈出。

如何获得基本的文档,以省去我用红色圆圈圈出的模型条目?我怀疑这与添加SchemaFilter有关。但我不知道如何应用它来解决此问题。

编辑:@ 0909EM的评论使我对SchemaFilter进行了一些深入研究,最终我使用了以下SchemaFilter:

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Linq;

namespace MyProject.SwaggerConfig
{
    public class RemoveBogusDefinitions : ISchemaFilter
    {
        public void Apply(OpenApiSchema schema, SchemaFilterContext context)
        {
            foreach (var item in context.SchemaRepository.Schemas.Keys.Where(r => r.EndsWith("ODataValue")))
                context.SchemaRepository.Schemas.Remove(item);

            context.SchemaRepository.Schemas.Remove("Void");
        }
    }
}

只要添加到schema的LAST context是我想要保留的有效模型,它就可以工作。问题是执行上面的代码,然后将schema添加到context。因此,如果正在处理的最后一个schema恰好是我要排除的那个,则上面的代码将无法执行。

如何防止schema添加到context

asp.net-core swagger odata swashbuckle
1个回答
0
投票

就我而言,仅此有效:

   internal class SwaggerSchemaFilter : ISchemaFilter
        {
            public void Apply(OpenApiSchema schema, SchemaFilterContext context)
            {
                var keys = new System.Collections.Generic.List<string>();
                var prefix = "My.Namespace";
                foreach(var key in context.SchemaRepository.Schemas.Keys)
                {
                   if (key.StartsWith(prefix))
                    {
                        keys.Add(key);
                    }
                }
                foreach(var key in keys)
                {
                    context.SchemaRepository.Schemas.Remove(key);
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.