我正在使用Swashbuckle为我的ASP.Net Core 3.1 OData项目生成Swagger文档。
控制器方法的生成是完美的。它可以根据模型正确生成模式,除了以下几点:
对于模式中的每个模型,它还会生成一个附加的[ModelName]IQueryableODataValue
条目,如下面的屏幕快照所示:
蓝色复选标记指示型号。用红色圈起来的模型条目是多余的条目,也正在添加。
注意,它也在生成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
?
就我而言,仅此有效:
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);
}
}
}