2015-04-17 5 views
33

weglassen Ich habe eine C# ASP.NET WebAPI-Anwendung mit API-Dokumentation automatisch generiert mit Swashbuckle. Ich möchte in der Lage bestimmte Methoden aus der Dokumentation weglassen, aber ich kann nicht scheinen, wie Swagger nicht sagen, sie in die Swagger UI-Ausgabe zu integrieren.Wie man Methoden von Swagger Dokumentation auf WebAPI mit Swashbuckle

Ich glaube, es ist etwas mit Hinzufügen eines Modells oder Schema-Filter zu tun, aber es ist nicht offensichtlich, was zu tun ist und die Dokumentation scheint nur Beispiele zur Verfügung zu stellen, wie Sie die Ausgabe für eine Methode ändern, nicht entfernen vollständig von der Ausgabe.

Vielen Dank im Voraus.

+2

Wer hat diese Frage abgelehnt und warum? Können Sie bitte den Anstand haben, die Argumentation zu erklären? –

Antwort

10

Sie können „Operationen“ aus dem Prahlerei Dokument entfernen, nachdem sie mit einem Dokument-Filter erzeugt wird - nur das Verb zu null gesetzt (obwohl, können es andere Wege geben, es auch zu tun)

Das folgende Beispiel erlaubt nur GET Verben - und ist aus this issue entnommen.

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 Ihrer Prahlerei config:

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

    conf.DocumentFilter<RemoveVerbsFilter>(); 
}); 
+0

Beachten Sie: Dies wird den Pfad nicht entfernen, auch wenn Sie 'path.get = null; auskommentieren '- als Ergebnis werden diese Pfade immer noch in der Swagger-Datei enthalten sein, aber nur ohne die Details. Es könnte besser sein, das 'ApiExplorerSettingsAttribute' in Ihre Antwort aufzunehmen, wie Sie es in Ihrer ursprünglichen Antwort auf GitHub erwähnt haben. Die Verwendung von ApiExplorerSettings kann auch verhindern, dass Typinformationen zur "Schemen" -Liste der Swagger-Datei hinzugefügt werden. – JBert

+0

vielen Dank für das Teilen. Es ist ein gutes Beispiel. – user2768132

0

Ich würde es vorziehen, die Wörterbuch entires für Pfad Artikel 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 nicht leer bekommen“ "Elemente in der generierten swagger.json-Definition.

44

Sie können das folgende Attribut zum Controller und Aktionen fügen Sie aus der erzeugten Dokumentation auszuschließen: [ApiExplorerSettings(IgnoreApi = true)]

+1

funktioniert wie ein Charme! :) – msk

+1

Arbeitete gut, das sollte die Antwort sein – JohnC

+0

Gibt es eine Möglichkeit, dies programmgesteuert zu tun?Ich möchte eine API in einigen Umgebungen, aber nicht in anderen, gemäß einer Konfigurationseinstellung verfügbar machen. –

6

Jemand hat die Lösung auf Github, damit ich es werde hier einfügen. Alle Kredite gehen an ihn. https://github.com/domaindrivendev/Swashbuckle/issues/153#issuecomment-213342771

erstellen zunächst ein Attribut Klasse

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

Dann

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

Dann in Swagger Config-Klasse ein Dokument Filterklasse erstellen, fügen das Dokument Filter

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

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

Letzter Schritt ist Hinzufügen des Attributs [HideInDocsAttribute] auf dem Controller oder der Methode y Sie möchten nicht, dass Swashbuckle Dokumentation generiert.

+0

Ich denke RemoveRoute könnte der Droide sein, den ich suche. –