Cómo omitir métodos de la documentación de Swagger en WebAPI usando Swashbuckle
Tengo una aplicación C# ASP.NET WebAPI con documentación API que se genera automáticamente usando Swashbuckle . Quiero poder omitir ciertos métodos de la documentación, pero parece que no puedo encontrar la manera de decirle a Swagger que no los incluya en la salida de la interfaz de usuario de Swagger.
Siento que tiene algo que ver con agregar un filtro de modelo o esquema , pero no es obvio qué hacer y la documentación solo parece proporcionar ejemplos de cómo modificar la salida de un método, no eliminarlo por completo de la salida.
Puede agregar el siguiente atributo a Controladores y Acciones para excluirlos de la documentación generada:[ApiExplorerSettings(IgnoreApi = true)]
Puede ayudar a alguien, pero durante el desarrollo (depuración) nos gusta exponer controladores y/o acciones completos y luego ocultarlos durante la producción (versión de lanzamiento).
#if DEBUG
[ApiExplorerSettings(IgnoreApi = false)]
#else
[ApiExplorerSettings(IgnoreApi = true)]
#endif
Alguien publicó la solución en github, así que la pegaré aquí. Todos los créditos son para él. https://github.com/domaindrivendev/Swashbuckle/issues/153#issuecomment-213342771
Crea primero una clase de atributo
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class HideInDocsAttribute : Attribute
{
}
Luego crea una clase de filtro de documentos.
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);
}
}
}
Luego, en la clase Swagger Config, agregue ese filtro de documento
public class SwaggerConfig
{
public static void Register(HttpConfiguration config)
{
var thisAssembly = typeof(SwaggerConfig).Assembly;
config
.EnableSwagger(c =>
{
...
c.DocumentFilter<HideInDocsFilter>();
...
})
.EnableSwaggerUi(c =>
{
...
});
}
}
El último paso es agregar el atributo [HideInDocsAttribute] en el Controlador o Método que no desea que Swashbuckle genere documentación.
Preferiría eliminar por completo las entradas del diccionario para los elementos de ruta:
var pathsToRemove = swaggerDoc.Paths
.Where(pathItem => !pathItem.Key.Contains("api/"))
.ToList();
foreach (var item in pathsToRemove)
{
swaggerDoc.Paths.Remove(item.Key);
}
Con este enfoque, no obtendría elementos "vacíos" en la definición de swagger.json generada.