从 NSwag swagger 中过滤模式

Filtering schema out of NSwag swagger

我有一个 ASP.NET 具有 API 个端点的完整框架应用程序。我正在使用 NSwag 生成 swagger 文档。这一切都有效。

我只需要为一小部分端点生成文档。路径已过滤,但模式未过滤。如何过滤架构对象以匹配路径过滤?

示例: 我有这个过滤器

    public class IncludeControllersInSwagger : IOperationProcessor
    {
        public Task<bool> ProcessAsync(OperationProcessorContext context)
        {
            return Task.FromResult(
                context.ControllerType == typeof(ControllerA));
        }
    }

启动时是这样的:
settings.GeneratorSettings.OperationProcessors.Add(new IncludeControllersInSwagger());

控制器是:

    public class AResponse
    {
        public string Message { get; set; }
        public bool Flag { get; set; }
    }

    public class BResponse
    {
        public string Message { get; set; }
        public int Count { get; set; }
    }

    [Route("a")]
    public class ControllerA : ApiController
    {
        [HttpGet]
        public AResponse Get()
        {
            return new AResponse
            {
                Message = "Hello from A",
                Flag = true
            };
        }
    }

    [Route("b")]
    public class ControllerB : ApiController
    {
        [HttpGet]
        public BResponse Get()
        {
            return new BResponse
            {
                Message = "Hello from B",
                Count = 42
            };
        }
    }

那么生成的swagger只包含一条路径:

  "paths": {
    "/a": {
      "get": {  .. etc
    }
  }

仅此而已,这是正确的。

但是 架构包含:

 "schemas": {
      "AResponse": {
        "type": "object",
        "additionalProperties": false,
 etc
      },
      "BResponse": {
        "type": "object",
        "additionalProperties": false,
etc
        }
      }
    }

BResponse类型不应该存在。如何删除它?

如果有超过 10 个端点,并且只有 2 个通过网关公开,因此在 swagger 中记录,这些额外数据使得模式部分非常冗长并且不适合 public 文档。

有一个 ISchemaProcessor 但它没有 return 像 IOperationProcessor 那样的布尔值。

您是否尝试过将操作筛选器添加为第一个元素?

OperationProcessors.Insert(0, new IncludeControllersInSwagger())

我认为这很重要,因为它会在生成 dto 模式并将其添加到文档之前过滤掉操作。

这不是您问题的答案,因为您已经找到了似乎有效的答案。不过我有一个建议。我建议创建一个自定义属性,而不是检查处理器中的控制器类型:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class IncludeInSwaggerAttribute : Attribute
{
}

然后更改您的处理器以查找此属性:

public class IncludeInSwaggerOperationProcessor : IOperationProcessor
{
    public async Task<bool> ProcessAsync(OperationProcessorContext context)
    {
        return context.ControllerType.GetCustomAttributes<IncludeInSwaggerAttribute>().Any() || 
               context.MethodInfo.GetCustomAttributes<IncludeInSwaggerAttribute>().Any();
    }
}

通过这种方式,您可以将属性添加到您想要包含在 swagger 中的任何新控制器,而无需更改您的处理器。您还可以在单​​个操作上添加属性以仅包含该操作,而控制器中的其余操作则不会大摇大摆。