如何在Swagger中隐藏OData元数据控制器?

5
在将我的项目更新到.NET6和OData8.0.4之后,出现了一个新的Metadata控制器以及这些端点:

enter image description here

我想办法禁用它或从我的服务中删除它。

添加OData服务的代码:

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services
        .AddControllers(mvcOptions => mvcOptions.EnableEndpointRouting = false)
        .AddOData(opt => opt.AddRouteComponents("", GetEdmModel()).Select().Expand());
}

版本:

  • .NET6
  • ASP.NET Core 6
  • OData 8.0.4
2个回答

7
以下有几个解决方法:
  1. 您可以使用控制器特性提供程序来排除MetadataController
  2. 您可以在ODataOptions中使用Conventions来删除MetadataRoutingConvention
  3. 您可以实现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)
    {
        // remove controller
        foreach (ApiDescription apiDescription in context.ApiDescriptions)
        {
            var actionDescriptor = (ControllerActionDescriptor)apiDescription.ActionDescriptor;
            if (actionDescriptor.ControllerName == "Metadata")
            {
                swaggerDoc.Paths.Remove($"/{apiDescription.RelativePath}");
            }
        }

        // remove schemas
        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")
            {
                // or just compare the name
                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(....)

1
我最近遇到了类似的问题。我通过以下方法解决了问题:
  • 从启动文件中删除OData服务注入(因为Swagger会自动添加元数据类,如果我尝试从启动文件中注入OData)
  • 将OData版本从8.0.4降级到8.0.0
  • 在控制器内实现ODataQueryOptions,而不是使用EnableQuery actionfilter
  • 在控制器内使用ODataBuilder/OdataModelBuilder,而不是在启动文件中使用。在我的情况下,它是ODataBuilder

enter image description here


谢谢,我会检查一下。我会给你一个答复。 - kanils_
你在控制器中注入OData了吗?另外,我已经实现了属性。已添加在问题中。 - kanils_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接