SilentTremor SilentTremor - 2 months ago 16
C# Question

swashbuckle set operationId

I need to know if it's possible to set up custom operationid, or a naming convention, I mean I know that operation filter can be overwritten the way how operationId is generated

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<MultipleOperationsWithSameVerbFilter>();


Now this is helpful transforming swagger description, check bellow:

enter image description here

All good, now I endup in a darker place, example similar with may cases: on same controller I have two endpoints


  • Post: /customer boddy: {email, location....}

  • Post: /customer/search boddy: {a filter, whatever}



The example is not quite correct (last post should be a get) but still le assume that webapi cannot be changed (new controller for separation) for this particular case I will try to figure out a way to generate operationId diffrent for each action somehow, but my question is this:


Is it possible to decorate somehow the controller actions similar with
[JsonIgnore] or with [Route("customer/delete")], to be explicit about the operationId.

Answer

You can use the SwaggerOperationAttribute provided by Swashbuckle for that.

[SwaggerOperation("get")]
public IEnumerable<Contact> Get()
{
    ....
}

[SwaggerOperation("getById")]
public IEnumerable<Contact> Get(string id)
{
    ...
}

You can use that attribute to add tags and schemes to your operation as well by the way. Have a look at the source code