问题描述
我需要向模型添加一个属性,并且我已经实现了 selected answer here 中建议的内容,它的工作原理是删除了我用模型的 SwaggerIgnorePropertyAttribute
属性标记的属性。
我的问题是,如果我的应用程序有多个 API 版本,如何将其从某些版本的 swagger doc/schema 中删除?我只关心不要大摇大摆地看到添加的属性。尽管我有多个版本的应用程序,但我在整个应用程序中只有 1 个版本的模型。
我添加了这样的版本:
services.AddSwaggerGen(
swaggerOptions =>
{
swaggerOptions.SwaggerDoc(
"v1",new Info
{
Title = "Titlebla1",Description = "bla1",Version = "v1"
});
swaggerOptions.SwaggerDoc(
"v2",new Info
{
Title = "Titlebla2",Description = "bla2",Version = "v2"
});
etc
我知道我可以通过使用 SwaggerDocument 并执行以下操作来找到版本:swaggerDoc.Info.Version
但是如何从下面的 SwaggerExcludePropertySchemaFilter 类中的 Apply 访问 SwaggerDocument ?
private class SwaggerExcludePropertySchemaFilter : ISchemaFilter
{
public void Apply(Schema schema,SchemaFilterContext context)
{
if (schema?.Properties == null)
{
return;
}
var excludedProperties = context.SystemType.GetProperties().Where(t => t.GetCustomAttribute<SwaggerIgnorePropertyAttribute>() != null);
foreach (var excludedProperty in excludedProperties)
{
var propertyToRemove = schema.Properties.Keys.SingleOrDefault(x => string.Equals(x,excludedProperty.Name,StringComparison.OrdinalIgnoreCase));
if (propertyToRemove != null)
{
schema.Properties.Remove(propertyToRemove);
}
}
}
}
解决方法
尝试使用 IDocumentFilter
,参见示例:
public class CustomSwaggerFilter : IDocumentFilter
{
public void Apply(OpenApiDocument swaggerDoc,DocumentFilterContext context)
{
var nonRequiredMYPropertyAPIs = swaggerDoc.Paths
.Where(x => !x.Key.ToLower().Contains("v1") /*the version you want to remove the property */)
.ToList();
nonRequiredMYPropertyAPIs.ForEach(x => {
swaggerDoc.Components.Schemas["YOUR_CLASS_MODEL"]
.Properties.Remove("PROPERTY_NAME_YOU_WANT_TO_IGNORE");
});
}
}
不要忘记注册过滤器:
c.DocumentFilter<CustomSwaggerFilter>();