列出多个组下的API方法

Bre*_*ias 2 c# asp.net-web-api swagger swashbuckle asp.net-core

我有Swashbuckle带注释的代码,如下所示:

[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
public class AddressesController : Controller
{
    [HttpGet("{aid}")]
    [SwaggerResponse(HttpStatusCode.OK, Type = typeof(PostalRecord))]
    public async Task<IActionResult> GetAddress(Guid id, Guid aid)
    {
       //do something
    }
Run Code Online (Sandbox Code Playgroud)

我想使用GroupActionsBy自定义,如本例所示,但我希望将上述GetAddress方法同时包含在两个独立的组中,这些组对应于显示的两个路由前缀:

[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
Run Code Online (Sandbox Code Playgroud)

换句话说,我希望在两者下列出相同的方法:

  • 认购
  • 组织

如何才能做到这一点?

顺便说一句,我正在使用ASP.NET Core(dnx46).如果还不能使用Swashbucklee的ASP.NET核心版本执行此操作,那么仍然可以欣赏完整的CLR(Web API 2.2?)示例.

另外,关于我正在尝试做的更完整的故事 - 我有一个单独的SO帖子.

更新

@venerik给出的答案让我接近解决方案.当我申请他的示例代码时......

[SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})]
Run Code Online (Sandbox Code Playgroud)

...这导致Swagger列表看起来像这样:

在此输入图像描述

简而言之,"地址"端点现在出现在我想要的标题下,但正如红色箭头所示,它们现在也被"交叉列出"; 我不希望"订户"端点列在"组织"端点下.

我怀疑[SwaggerOperationFilter]可能是答案的"另一半",如果我可以删除交叉列表的条目.我之前没有玩过这种机制.

另外,非常不幸的是[SwaggerOperation]只能应用于方法/动作.我宁愿把它应用到类本身:

[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
[SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})]
public class AddressesController : Controller
{
Run Code Online (Sandbox Code Playgroud)

这有什么补救措施吗?

ven*_*rik 8

我还没有使用 ASP.NET Core 的经验,但在 ASP.NET Web API 中,您可以使用SwaggerOperationAttribute. 您可以使用此属性向操作添加标签。例如,下一段代码添加标签SubscribersOrganizations

[SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
   //do something
}
Run Code Online (Sandbox Code Playgroud)

Swagger-UI 按标签对操作进行分组,因此,将在和GetAddress下列出。SubscribersOrganizations


Bre*_*ias 6

@venerik让我走上了正确的道路.但不是[SwaggerOperation]属性,我需要的是一个[SwaggerOperationFilter],像这样:

public class CategorizeFilter : IOperationFilter
{
    public void Apply(Operation operation, OperationFilterContext context)
    {
        string path = context.ApiDescription.RelativePath;
        string segment = path.Split('/')[1];

        if (segment != context.ApiDescription.GroupName)
        {
            operation.Tags = new List<string> { segment };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我根据需要装饰我的行为:

[Route("api/Subscribers/{id}/[controller]")]
[Route("api/Organizations/{id}/[controller]")]
public class AddressesController : Controller
{
    [HttpGet("{aid}")]
    [SwaggerOperationFilter(typeof(CategorizeFilter))]
    [SwaggerResponse(HttpStatusCode.OK, Type = typeof(PostalRecord))]
    public async Task<IActionResult> GetAddress(Guid id, Guid aid)
    {
       //do something
    }
Run Code Online (Sandbox Code Playgroud)

因此,"地址"类别完全从我的Swagger UI中消失(好!),并且两组端点路由在"组织"和"订阅者"组之间正确划分.完善!