Cómo omitir métodos de la documentación de Swagger en WebAPI usando Swashbuckle

Resuelto payetools-steve asked hace 9 años • 0 respuestas

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.

payetools-steve avatar Apr 17 '15 21:04 payetools-steve
Aceptado

Puede agregar el siguiente atributo a Controladores y Acciones para excluirlos de la documentación generada:[ApiExplorerSettings(IgnoreApi = true)]

mikesigs avatar Jan 12 '2017 22:01 mikesigs

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  
Soeren Pedersen avatar Jun 08 '2020 21:06 Soeren Pedersen

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.

Paulo Pozeti avatar Feb 14 '2017 20:02 Paulo Pozeti

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.

Denis Biondic avatar Dec 15 '2016 19:12 Denis Biondic