手动设置 operationId 以允许在 Swashbuckle 中使用同一个动词进行多个操作
Manually set operationId to allow multiple operations with the same verb in Swashbuckle
我需要知道是否可以设置自定义 operationid 或命名约定,我的意思是我知道可以按照 operationId 的生成方式覆盖操作过滤器
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: /customer body: {email, location....}
- Post: /customer/search boddy: {过滤器,随便什么}
这个例子不太正确(最后一个 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
,但我喜欢这样使用 nameof
:nameof(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
我需要知道是否可以设置自定义 operationid 或命名约定,我的意思是我知道可以按照 operationId 的生成方式覆盖操作过滤器
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: /customer body: {email, location....}
- Post: /customer/search boddy: {过滤器,随便什么}
这个例子不太正确(最后一个 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 提供的 SwaggerOperationAttribute
。
[SwaggerOperation("get")]
public IEnumerable<Contact> Get()
{
....
}
[SwaggerOperation("getById")]
public IEnumerable<Contact> Get(string id)
{
...
}
顺便说一句,您也可以使用该属性为您的操作添加标签和方案。看看 source code
对于 swashbuckle 5.0,您可以使用 Name
属性。您可以将其设置为任何 string
,但我喜欢这样使用 nameof
:nameof(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