1

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

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

示例:我有这个过滤器

    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
            };
        }
    }

然后生成的招摇只包含一个路径:

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

仅此而已,这是正确的。

模式包含两者:

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

BResponse类型不应该在那里。你如何删除它?

在有超过 10 个端点的情况下,这些额外的数据使得 Schemas 部分非常冗长且不适合公共文档,并且只有 2 个通过网关公开并因此以招摇方式记录。

有一个ISchemaProcessor,但它不会像IOperationProcessor.

4

2 回答 2

5

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

[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 中的任何新控制器,而无需更改处理器。您还可以在单​​个操作上添加属性以仅包含该操作,而使控制器中的其余操作不招摇。

于 2019-05-24T13:28:59.310 回答
5

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

IEOperationProcessors.Insert(0, new IncludeControllersInSwagger())

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

于 2019-02-26T22:31:18.150 回答