从 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 中的任何新控制器,而无需更改您的处理器。您还可以在单个操作上添加属性以仅包含该操作,而控制器中的其余操作则不会大摇大摆。
我有一个 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 中的任何新控制器,而无需更改您的处理器。您还可以在单个操作上添加属性以仅包含该操作,而控制器中的其余操作则不会大摇大摆。