我正在使用aspnet core 2.2创建宁静的API。我有一个标准设置,其中每个模型都有一个自己的控制器,它们带有一个g
和一个GET
动作。我正在使用POST
NUGET软件包,并使用Microsoft文档中的this文章。
现在,当我查看生成的swagger文件时,它具有多个GET和POST operationIds。如何不使用Swashbuckle.AspNetCore
来配置自定义operationId?
这是我的Action方法的样子:
Swashbuckle.AspNetCore.Annotations
我有多个控制器,它们都遵循相同的模式。
我的Startup类如下:
[HttpPost]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
[ProducesResponseType(500)]
public async Task<ActionResult<Response>> PostAsync([FromBody]Request request)
{
Response result = await _context.PostAsync(request);
return Ok(result);
}
我已经研究过this解决方案,但不想走那条路。
答案 0 :(得分:6)
花了几个小时试图找到最佳解决方案后,我发现了两种方法:
选项1 :基于约定-SwaggerGen
可以选择设置CustomOperationIds
。因此,您可以像这样简单地将其设置为使用ControllerName_HttpMethod
:
services.AddSwaggerGen(c =>
{
c.CustomOperationIds(e => $"{e.ActionDescriptor.RouteValues["controller"]}_{e.HttpMethod}");
c.SwaggerDoc("v1", new Info { Title = "ID&V API", Version = "v1" });
});
这将遵循ControllerName_HttpMethod
约定将operationIds添加到您的所有方法中。
选项2 :基于ActionFilter /属性-您可以配置每个Action方法(就像您通过简单地向您的SwaggerOperation
属性添加Name
操作过滤器一样HTTP动词操作过滤器是这样的:
[HttpPost(Name="Post_Person")]
[ProducesResponseType(200)]
[ProducesResponseType(400)]
[ProducesResponseType(500)]
public async Task<ActionResult<Response>> PostAsync([FromBody]Request request)
{
Response result = await _context.PostAsync(request);
return Ok(result);
}
这与[SwaggerOperation(OperationId = "Post_Person")]
完全一样,但是不需要EnableAnnotations
Swashbuckle.AspNetCore
文档可以找到here