【问题标题】:.NET 3 WebAPI: how to enable or disable multiple controller?.NET 3 WebAPI:如何启用或禁用多个控制器?
【发布时间】:2020-07-02 23:02:12
【问题描述】:

我的 .NET Core 3.1 应用程序包含多个 REST 端点,我将它们拆分为 3 ApiController。我想从 appsettings 激活控制器。

每个控制器都使用一些 DependencyInjection 来使用相关的组件来完成这项工作。

所有配置和控制器部分都运行正常,我已经过滤掉了“相关组件”,但我很难过滤掉一些要创建的控制器?

查看此处描述的过滤器: https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-3.1 可能是错误的工具,因为我想完全阻止要创建的控制器类!

我在看

    services.AddControllers(options =>
    {
    });

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();   // I only see the default endpoint here
    });

还有 Swagger 生成选项,但尚未找到适合 .NET Core 3.x 的解决方案

有什么想法吗?

【问题讨论】:

    标签: c# .net asp.net-web-api


    【解决方案1】:

    我还没有找到禁用要创建的控制器的方法。 所以我最终实现了注入的相关组件,以在控制器的端点中调用时回复“Api disabled”。

    至少,可以从 Swagger/OpenApi 页面中删除控制器。 控制器上的ApiExplorerSettings 在编译时完成

    [ApiController]
    [ApiExplorerSettings(IgnoreApi = true)]
    [ApiVersion("1")]
    [Route("v{version:apiVersion}/myPath1")]
    public class MyController
    {
    }
    

    但这对我来说不是一个选项,因为我想在运行时使用它。 也可以使用 DocumentFiler 在运行时执行此操作,如回答 herethere

    这是在生成 Swagger 时从 Startup.ConfigureServices 调用的:

    services.AddSwaggerGen(options =>
    {
        options.DocumentFilter<OpenApiDocFilter>(flag1, flag2);
    }
    

    以及过滤器的实现

    public class OpenApiDocFilter : IDocumentFilter
    {
        private readonly bool _flag1;
        private readonly bool _flag2;
    
        public OpenApiDocFilter(bool flag1, bool flag2)
        {
            _flag1 = flag1;
            _flag2 = flag2;
        }
    
        /// <inheritdoc/>
        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
        {
            if (swaggerDoc?.Paths == null)
                return;
    
            var pathsToRemove = swaggerDoc.Paths
                .Where(pathItem => pathItem.Key != null &&
                    ((_flag1 && pathItem.Key.Contains("/myPath1", StringComparison.OrdinalIgnoreCase))) ||
                     (_flag2 && pathItem.Key.Contains("/myPath2", StringComparison.OrdinalIgnoreCase))))
                .Select(s => s.Key)
                .ToList();
    
            foreach (string item in pathsToRemove)
            {
                swaggerDoc.Paths.Remove(item);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多