wake-up-neo.net

So lassen Sie Methoden aus der Swagger-Dokumentation in der Web-API mit Swashbuckle aus

Ich habe eine C # ASP.NET-WebAPI-Anwendung, deren API-Dokumentation automatisch mit Swashbuckle generiert wird. Ich möchte in der Lage sein, bestimmte Methoden wegzulassen aus der Dokumentation, aber ich kann nicht herausfinden, wie ich Swagger anweisen kann, sie nicht in die Swagger-Benutzeroberflächenausgabe aufzunehmen. 

Ich habe das Gefühl, dass es etwas mit Hinzufügen eines Modell- oder Schemafilterszu tun hat, aber es ist nicht offensichtlich, was zu tun ist, und die Dokumentation scheint nur Beispiele dafür zu geben, wie die Ausgabe für eine Methode geändert wird, nicht aber entfernt werden vollständig von der Ausgabe.

Danke im Voraus.

66
SteveWilkinson

Sie können Controllers und Aktionen das folgende Attribut hinzufügen, um sie aus der generierten Dokumentation auszuschließen: [ApiExplorerSettings(IgnoreApi = true)]

150
mikesigs

Sie können "Vorgänge" aus dem Swagger-Dokument entfernen, nachdem es mit einem Dokumentfilter generiert wurde. Setzen Sie einfach das Verb auf null.

Das folgende Beispiel erlaubt nur GET Verben - und stammt aus diesem Problem .

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

und in deiner Swagger-Konfiguration:

...EnableSwagger(conf => 
{
    // ...

    conf.DocumentFilter<RemoveVerbsFilter>();
});
11
Dave Transom

Jemand hat die Lösung bei github veröffentlicht, also werde ich sie hier einfügen. Alle Credits gehen an ihn. https://github.com/domaindrivendev/Swashbuckle/issues/153#issuecomment-213342771

Erstellen Sie zuerst eine Attributklasse

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class HideInDocsAttribute : Attribute
{
}

Erstellen Sie dann eine Dokumentfilterklasse

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

Fügen Sie dann in der Swagger Config-Klasse diesen Dokumentfilter hinzu

public class SwaggerConfig
{
    public static void Register(HttpConfiguration config)
    {
        var thisAssembly = typeof(SwaggerConfig).Assembly;

        config
             .EnableSwagger(c =>
                {
                    ...                       
                    c.DocumentFilter<HideInDocsFilter>();
                    ...
                })
            .EnableSwaggerUi(c =>
                {
                    ...
                });
    }
}

Der letzte Schritt ist das Hinzufügen des Attributs [HideInDocsAttribute] auf dem Controller oder der Methode, die nicht von Swashbuckle erstellt werden soll.

9
Paulo Pozeti

Machen Sie einen Filter

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

Machen Sie ein Attribut

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class SwaggerTagAttribute : Attribute
{
}

Bewerben Sie sich in startup.cs

 services.AddSwaggerGen(c => {
            c.SwaggerDoc(1,
                new Info { Title = "API_NAME", Version = "API_VERSION" });
            c.DocumentFilter<SwaggerTagFilter>(); // [SwaggerTag]
        });

Fügen Sie das [SwaggerTag] -Attribut zu Methoden und Controllern hinzu, die Sie in Swagger JSON einfügen möchten

1
Rowan Stringer

Ich würde es vorziehen, die Wörterbucheinträge für Pfadelemente vollständig zu entfernen: 

var pathsToRemove = swaggerDoc.Paths
                .Where(pathItem => !pathItem.Key.Contains("api/"))
                .ToList();

foreach (var item in pathsToRemove)
{
    swaggerDoc.Paths.Remove(item.Key);
}

Mit diesem Ansatz würden Sie keine "leeren" Elemente in der generierten swagger.json-Definition erhalten.

1
Denis Biondic

Basierend auf @spottedmahns answer . Meine Aufgabe war umgekehrt. Nur die erlaubten anzeigen.

Frameworks: .NetCore 2.1; Swagger: 3.0.0

Attribut hinzugefügt 

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class ShowInSwaggerAttribute : Attribute
{
}

Und implementiere benutzerdefinierte 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 -Code:

public void ConfigureServices(IServiceCollection services)
{
     // other code

    services.AddSwaggerGen(c =>
    {
        // other configurations
        c.DocumentFilter<ShowInSwaggerFilter>();
    });
}
0
aleha