AspNetCore 2.2自定义/显式Swagger OperationId

时间:2019-01-21 15:47:20

标签: asp.net-core swagger swashbuckle

我正在使用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解决方案,但不想走那条路。

1 个答案:

答案 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