以下有几个解决方法:
- 您可以使用控制器特性提供程序来排除
MetadataController
- 您可以在
ODataOptions
中使用Conventions
来删除MetadataRoutingConvention
- 您可以实现
DocumentFilter
来隐藏Swagger中的MetadataController
和相关架构。
#2是最简单的方法。
services
.AddControllers()
.AddOData(opt =>
{
opt.Conventions.Remove(opt.Conventions.OfType<MetadataRoutingConvention>().First());
opt.AddRouteComponents("", GetEdmModel()).Select().Expand();
});
# 3 如果您只想从 Swagger 隐藏 MetadataController
和相关架构:
public class SwaggerODataControllerDocumentFilter : IDocumentFilter
{
public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
{
foreach (ApiDescription apiDescription in context.ApiDescriptions)
{
var actionDescriptor = (ControllerActionDescriptor)apiDescription.ActionDescriptor;
if (actionDescriptor.ControllerName == "Metadata")
{
swaggerDoc.Paths.Remove($"/{apiDescription.RelativePath}");
}
}
foreach ((string key, _) in swaggerDoc.Components.Schemas)
{
if (key.Contains("Edm") || key.Contains("OData"))
{
swaggerDoc.Components.Schemas.Remove(key);
}
}
}
}
将其添加到
services.AddSwaggerGen
中:
cfg.DocumentFilter<SwaggerODataControllerDocumentFilter>();
对于选项#1,你可以这样做:
public class RemoveMetadataControllerFeatureProvider : ControllerFeatureProvider
{
protected override bool IsController(TypeInfo typeInfo)
{
if (typeInfo.FullName == "Microsoft.AspNetCore.OData.Routing.Controllers.MetadataController")
{
return false;
}
return base.IsController(typeInfo);
}
}
在startup.cs文件中
services.AddControllers()
.ConfigureApplicationPartManager(manager =>
{
manager.FeatureProviders.Remove(manager.FeatureProviders.OfType<ControllerFeatureProvider>().FirstOrDefault());
manager.FeatureProviders.Add(new RemoveMetadataControllerFeatureProvider());
}).AddOData(....)