我有一个C#ASP.NET WebAPI应用程序,带有使用Swashbuckle自动生成的API文档。我希望能够从文档中省略某些方法,但似乎无法弄清楚如何告诉Swagger不要将它们包括在Swagger UI输出中。
我感觉这与添加模型或模式过滤器有关,但操作不明显,文档似乎仅提供了如何修改方法输出的示例,而不是将其从输出中完全删除。
提前致谢。
我有一个C#ASP.NET WebAPI应用程序,带有使用Swashbuckle自动生成的API文档。我希望能够从文档中省略某些方法,但似乎无法弄清楚如何告诉Swagger不要将它们包括在Swagger UI输出中。
我感觉这与添加模型或模式过滤器有关,但操作不明显,文档似乎仅提供了如何修改方法输出的示例,而不是将其从输出中完全删除。
提前致谢。
Answers:
您可以将以下属性添加到Controllers and Actions,以将其从生成的文档中排除: [ApiExplorerSettings(IgnoreApi = true)]
有人在github上发布了解决方案,所以我将其粘贴到这里。所有的功劳归他所有。https://github.com/domaindrivendev/Swashbuckle/issues/153#issuecomment-213342771
首先创建一个Attribute类
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class HideInDocsAttribute : Attribute
{
}
然后创建一个文档过滤器类
public class HideInDocsFilter : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
foreach (var apiDescription in apiExplorer.ApiDescriptions)
{
if (!apiDescription.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<HideInDocsAttribute>().Any() && !apiDescription.ActionDescriptor.GetCustomAttributes<HideInDocsAttribute>().Any()) continue;
var route = "/" + apiDescription.Route.RouteTemplate.TrimEnd('/');
swaggerDoc.paths.Remove(route);
}
}
}
然后在Swagger Config类中,添加该文档过滤器
public class SwaggerConfig
{
public static void Register(HttpConfiguration config)
{
var thisAssembly = typeof(SwaggerConfig).Assembly;
config
.EnableSwagger(c =>
{
...
c.DocumentFilter<HideInDocsFilter>();
...
})
.EnableSwaggerUi(c =>
{
...
});
}
}
最后一步是在您不希望Swashbuckle生成文档的Controller或Method上添加[HideInDocsAttribute]属性。
您可以在使用文档过滤器生成的招摇文档中删除“操作”,只需将动词设置为 null
(尽管也可以使用其他方式)
下面的示例仅允许GET
动词-并从此问题中获取。
class RemoveVerbsFilter : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
foreach (PathItem path in swaggerDoc.paths.Values)
{
path.delete = null;
//path.get = null; // leaving GET in
path.head = null;
path.options = null;
path.patch = null;
path.post = null;
path.put = null;
}
}
}
并在您昂首阔步的配置中:
...EnableSwagger(conf =>
{
// ...
conf.DocumentFilter<RemoveVerbsFilter>();
});
path.get = null;
-因此,这些路径仍将包含在Swagger文件中,但没有详细信息。ApiExplorerSettingsAttribute
如您在GitHub上的原始回复中提到的那样,最好将其包含在您的答案中。使用ApiExplorerSettings还可避免将类型信息添加到Swagger文件的schemes
列表中。
我希望完全删除路径项的字典条目:
var pathsToRemove = swaggerDoc.Paths
.Where(pathItem => !pathItem.Key.Contains("api/"))
.ToList();
foreach (var item in pathsToRemove)
{
swaggerDoc.Paths.Remove(item.Key);
}
使用这种方法,您将不会在生成的swagger.json定义中获得“空”项目。
制作一个过滤器
public class SwaggerTagFilter : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
{
foreach(var contextApiDescription in context.ApiDescriptions)
{
var actionDescriptor = (ControllerActionDescriptor)contextApiDescription.ActionDescriptor;
if(!actionDescriptor.ControllerTypeInfo.GetCustomAttributes<SwaggerTagAttribute>().Any() &&
!actionDescriptor.MethodInfo.GetCustomAttributes<SwaggerTagAttribute>().Any())
{
var key = "/" + contextApiDescription.RelativePath.TrimEnd('/');
swaggerDoc.Paths.Remove(key);
}
}
}
}
设定一个属性
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class SwaggerTagAttribute : Attribute
{
}
应用于startup.cs
services.AddSwaggerGen(c => {
c.SwaggerDoc(1,
new Info { Title = "API_NAME", Version = "API_VERSION" });
c.DocumentFilter<SwaggerTagFilter>(); // [SwaggerTag]
});
将[SwaggerTag]属性添加到要包含在Swagger JSON中的方法和控制器中
可能对某人有帮助,但在开发(调试)期间,我们希望公开整个Controller和/或Action,然后在生产期间将其隐藏(发行版本)
#if DEBUG
[ApiExplorerSettings(IgnoreApi = false)]
#else
[ApiExplorerSettings(IgnoreApi = true)]
#endif
基于@spottedmahns 答案。反之亦然。仅显示允许的那些。
框架:.NetCore 2.1;摇摇欲坠:3.0.0
新增属性
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class ShowInSwaggerAttribute : Attribute
{
}
并实现自定义IDocumentFilter
public class ShowInSwaggerFilter : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
{
foreach (var contextApiDescription in context.ApiDescriptions)
{
var actionDescriptor = (ControllerActionDescriptor) contextApiDescription.ActionDescriptor;
if (actionDescriptor.ControllerTypeInfo.GetCustomAttributes<ShowInSwaggerAttribute>().Any() ||
actionDescriptor.MethodInfo.GetCustomAttributes<ShowInSwaggerAttribute>().Any())
{
continue;
}
else
{
var key = "/" + contextApiDescription.RelativePath.TrimEnd('/');
var pathItem = swaggerDoc.Paths[key];
if(pathItem == null)
continue;
switch (contextApiDescription.HttpMethod.ToUpper())
{
case "GET":
pathItem.Get = null;
break;
case "POST":
pathItem.Post = null;
break;
case "PUT":
pathItem.Put = null;
break;
case "DELETE":
pathItem.Delete = null;
break;
}
if (pathItem.Get == null // ignore other methods
&& pathItem.Post == null
&& pathItem.Put == null
&& pathItem.Delete == null)
swaggerDoc.Paths.Remove(key);
}
}
}
}
ConfigureServices代码:
public void ConfigureServices(IServiceCollection services)
{
// other code
services.AddSwaggerGen(c =>
{
// other configurations
c.DocumentFilter<ShowInSwaggerFilter>();
});
}
添加一行SwaggerConfig c.DocumentFilter();
public class HideInDocsFilter : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
var pathsToRemove = swaggerDoc.Paths
.Where(pathItem => !pathItem.Key.Contains("api/"))
.ToList();
foreach (var item in pathsToRemove)
{
swaggerDoc.Paths.Remove(item.Key);
}
}
}
将此添加到您要忽略的方法之上-
[ApiExplorerSettings(IgnoreApi=true)]