Swashbuckle set manualy operationId

Ho bisogno di sapere se è ansible impostare customid di operazione, o una convenzione di denominazione, voglio dire so che il filtro di operazione può essere sovrascritto il modo in cui viene generato operationId

https://azure.microsoft.com/en-us/documentation/articles/app-service-api-dotnet-swashbuckle-customize/

using Swashbuckle.Swagger; using System.Web.Http.Description; namespace Something { public class MultipleOperationsWithSameVerbFilter : IOperationFilter { public void Apply( Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { if (operation.parameters != null) { operation.operationId += "By"; foreach (var parm in operation.parameters) { operation.operationId += string.Format("{0}",parm.name); } } } } } 

in SwaggerConfig.cs

  c.OperationFilter(); 

Ora questo è utile per trasformare la descrizione dello swagger, controlla qui sotto:

inserisci la descrizione dell'immagine qui

Tutto bene, ora mi ritrovo in un posto più buio, un esempio simile ai casi di maggio: sullo stesso controller ho due endpoint

  • Post: / customer boddy: {email, posizione ….}
  • Post: / customer / search boddy: {un filtro, qualunque sia}

L’esempio non è del tutto corretto (l’ultimo post dovrebbe essere un get) ma supponiamo che webapi non possa essere cambiato (nuovo controller per la separazione) per questo caso particolare proverò a capire un modo per generare operationId diffrent per ogni azione in qualche modo, ma la mia domanda è questa:

È ansible decorare in qualche modo le azioni del controller in modo simile a [JSONIgnore] o con [Route (“cliente / elimina”)], per essere espliciti riguardo all’operazioneId .

Puoi usare SwaggerOperationAttribute fornito da Swashbuckle per quello.

 [SwaggerOperation("get")] public IEnumerable Get() { .... } [SwaggerOperation("getById")] public IEnumerable Get(string id) { ... } 

È ansible utilizzare tale attributo anche per aggiungere tag e schemi all’operazione. Dai un’occhiata al codice sorgente

AGGIORNAMENTO: per importare le API di rest funzionale in Visual Studio senza un sacco di refactoring (aggiungendo il nome dell’operazione a mano)

Ho aggiornato un po ‘il filtro delle operazioni personalizzate, questo genera ID univoci nel 99% dei casi. Il restante percento proviene dalla sfortunata implementazione dell’API.

  public class MultipleOperationsWithSameVerbFilter : IOperationFilter { public void Apply( Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { string refsSwaggerIds = string.Empty; operation.parameters?.ForEach(x => { if (!string.IsNullOrEmpty([email protected]) && !string.IsNullOrEmpty([email protected]('/').LastOrDefault())) { refsSwaggerIds += [email protected]('/').LastOrDefault(); } else { refsSwaggerIds += x.name; } }); operation.operationId += !string.IsNullOrEmpty(refsSwaggerIds) ? refsSwaggerIds : apiDescription.RelativePath?.Replace("/", "_").Replace("{", "").Replace("}", ""); } } public class HandleComplexTypesFromUri : IOperationFilter { public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { //this is incorect form swager helper pov, but for rest api import in visual studio is the only way for GET with complex type to be imported if (operation.parameters == null || apiDescription.HttpMethod.Method != "GET") return; var models = schemaRegistry.Definitions; var apiParams = apiDescription.ParameterDescriptions; if (apiParams.Count == operation.parameters.Count) return; foreach (var apiParameterDescription in apiParams) { if (!models.ContainsKey(apiParameterDescription.ParameterDescriptor.ParameterType.Name)) continue; operation.parameters = operation.parameters.Where( x => [email protected] != "query" || ([email protected] == "query" && !x.name.StartsWith(apiParameterDescription.Name + "."))).ToList(); if (operation.parameters.Count(x => x.name == apiParameterDescription.Name) == 0) { //var t = Type.GetType(apiParameterDescription.ParameterDescriptor.ParameterType.Name); operation.parameters.Add(new Parameter { name = apiParameterDescription.Name.ToLowerInvariant(), //type = apiParameterDescription.ParameterDescriptor.ParameterType.Name, @in = "query", required = true, schema = schemaRegistry.GetOrRegister(apiParameterDescription.ParameterDescriptor.ParameterType) //schema = models[apiParameterDescription.ParameterDescriptor.ParameterType.Name] }); } } } 

Nell’uso di swagger config

 GlobalConfiguration.Configuration .EnableSwagger(c => // at some point c.OperationFilter(); c.OperationFilter(); })// the rest ...