手动设置 operationId 以允许在 Swashbuckle 中使用同一个动词进行多个操作

Manually set operationId to allow multiple operations with the same verb in Swashbuckle

我需要知道是否可以设置自定义 operationid 或命名约定,我的意思是我知道可以按照 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);
                }
            }
        }
    }
}

在SwaggerConfig.cs

 c.OperationFilter<MultipleOperationsWithSameVerbFilter>();

现在这有助于转换 swagger 描述,请查看以下内容:

很好,现在我遇到了另一个问题,示例类似于可能的情况:在同一个控制器上我有两个端点

这个例子不太正确(最后一个 post 应该是一个 get)但是仍然假设对于这个特殊情况不能更改 webapi(用于分离的新控制器)我将尝试找出一种方法以某种方式为每个操作生成不同的 operationId,但我的问题是:

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

编辑 此答案与 Swashbuckle 5.6 和 .NET Framework 相关。请阅读 了解 Swashbuckle 和 .NET Core

您可以使用 Swashbuckle 提供的 SwaggerOperationAttribute

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

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

顺便说一句,您也可以使用该属性为您的操作添加标签和方案。看看 source code

对于 swashbuckle 5.0,您可以使用 Name 属性。您可以将其设置为任何 string,但我喜欢这样使用 nameofnameof(ActualMethodName).

[HttpGet("{id:int}", Name = nameof(GetProductById))]
public IActionResult GetProductById(int id) // operationId = "GetProductById"'

[HttpGet("{id:int}", Name = "GetProductById")]
public IActionResult GetProductById(int id) // operationId = "GetProductById"'

列出了其他几个选项here