2015-04-17 13 views
33

Ho un'applicazione WebAPI ASP.NET C# con documentazione API generata automaticamente utilizzando Swashbuckle. Voglio essere in grado di omettere determinati metodi dalla documentazione, ma non riesco a capire come dire a Swagger di non includerli nell'output dell'interfaccia utente Swagger.Come omettere i metodi dalla documentazione Swagger su WebAPI utilizzando Swashbuckle

ho la sensazione che è qualcosa a che fare con l'aggiunta di un modello o schema di filtro ma non è ovvio cosa fare e la documentazione sembra solo quello di fornire esempi di come modificare l'uscita di un metodo, non rimuoverla completamente dall'output.

Grazie in anticipo.

+2

Chi ha votato questa domanda e perché? Puoi per favore avere la decenza di spiegare il ragionamento. –

risposta

10

È possibile rimuovere "operazioni" dal documento spavalderia dopo che è generato con un filtro documento - basta impostare il verbo null (anche se, ci possono essere altri modi per farlo pure)

Nell'esempio riportato di seguito consente solo i verbi GET - ed è preso da this issue.

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

e nella vostra spavalderia config:

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

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

Nota: questo non rimuoverà il percorso anche se decommenti 'path.get = null;' - di conseguenza tali percorsi saranno comunque inclusi nel file Swagger ma solo senza i dettagli. Potrebbe essere meglio includere "ApiExplorerSettingsAttribute" nella tua risposta come hai menzionato nella tua risposta originale su GitHub. L'utilizzo di ApiExplorerSettings potrebbe anche evitare l'aggiunta di informazioni di tipo all'elenco 'schemi' del file Swagger. – JBert

+0

grazie mille per aver condiviso questo. è un buon esempio. – user2768132

0

io preferirei eliminare le entires del dizionario per gli articoli strada completamente:

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

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

Con questo approccio, non si otterrebbe "vuoto "elementi nella definizione swagger.json generata.

44

È possibile aggiungere il seguente attributo al controller e azioni di escluderli dalla documentazione generata: [ApiExplorerSettings(IgnoreApi = true)]

+1

funziona come un incantesimo! :) – msk

+1

Ha funzionato benissimo, questa dovrebbe essere la risposta – JohnC

+0

C'è un modo per farlo a livello di programmazione?Voglio esporre un'API in alcuni ambienti ma non in altri, in base a un'impostazione di configurazione. –

6

Qualcuno ha postato la soluzione su github così ho intenzione di incollare qui. Tutti i crediti vanno a lui. https://github.com/domaindrivendev/Swashbuckle/issues/153#issuecomment-213342771

prima creare una classe Attribute

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

quindi creare una classe di filtro documento

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

Poi in classe Swagger Config, aggiungere che il filtro documento

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

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

Ultimo passo è per aggiungere l'attributo [HideInDocsAttribute] sul controller o sul metodo y Non vuoi che Swashbuckle generi documentazione.

+0

Penso che RemoveRoute potrebbe essere il droide che sto cercando. –

Problemi correlati