Sto cercando un modo per mostrare/nascondere le rotte WebAPI nella documentazione Swagger usando SwashBuckle in un modo configurabile. Aggiungere [ApiExplorerSettings(IgnoreApi = true)]
nasconderà effettivamente i percorsi ma dovrei ricompilare ogni volta che voglio che cambi.Rimuovere un percorso con IOperationFilter in SwashBuckle
Ho cercato di creare un IOperationFilter
per lavorare con un attributo personalizzato che ho definito. In questo modo posso decorare i percorsi con un [SwaggerTag("MobileOnly")]
e controllare il web.config o qualcosa del genere per vedere se il percorso deve essere mostrato. L'attributo è definito come tale:
public class SwaggerTagAttribute : Attribute
{
public string[] Tags { get; private set; }
public SwaggerTagAttribute(params string[] tags)
{
this.Tags = tags;
}
}
Il IOperationFilter
che rileva l'attributo è definito e il IDocumentFilter
che rimuove il percorso è definito qui:
public class RemoveTaggedOperationsFilter : IOperationFilter, IDocumentFilter
{
private List<string> TagsToHide;
public RemoveTaggedOperationsFilter()
{
TagsToHide = ConfigurationManager.AppSettings["TagsToHide"].Split(',').ToList();
}
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
var tags = apiDescription.ActionDescriptor
.GetCustomAttributes<SwaggerTagAttribute>()
.Select(t => t.Tags)
.FirstOrDefault();
if (tags != null && TagsToHide.Intersect(tags).Any())
{
operation.tags = new List<string> {"Remove Me "};
}
}
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
foreach (var value in swaggerDoc.paths.Values)
{
if (value.post != null && value.post.tags.Contains("Remove Me"))
value.post = null;
if (value.get != null && value.get.tags.Contains("Remove Me"))
value.get = null;
if (value.put != null && value.put.tags.Contains("Remove Me"))
value.put = null;
if (value.delete != null && value.delete.tags.Contains("Remove Me"))
value.delete = null;
}
}
}
registrato in quanto tale:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.OperationFilter<RemoveTaggedOperationsFilter>();
c.DocumentFilter<RemoveTaggedOperationsFilter>();
});
Ritengo che questo sia inefficiente e hacky per taggare qualcosa per la rimozione in un secondo momento, quando potrò accedervi in precedenza. Esiste un modo per rimuovere semplicemente la rotta dall'interno di IOperationFilter.Apply
anziché attendere lo IDocumentFilter
e scansionarla?
Questo approccio non funziona se si ha lo stesso percorso con diversi verbi, ma si vuole disabilitare solo alcuni. Con GET/trascrizioni e POST/transazioni, entrambi vengono rimossi quando solo un metodo di azione è decorato con l'attributo personalizzato. Dovresti anche prendere in considerazione il metodo http. –
@ParaJaco è un ottimo punto. Probabilmente non sarebbe troppo difficile estenderlo per prendere in considerazione i verbi HTTP. – LukeP
Posso decorare l'intero controller? – Rbacarin