列出多个组下的API方法

我有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 GetAddress(Guid id, Guid aid) { //do something } 

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

 [Route("api/Subscribers/{id}/[controller]")] [Route("api/Organizations/{id}/[controller]")] 

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

  • 认购
  • 组织

如何才能做到这一点?

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

另外,关于我正在尝试做的更完整的故事 – 我有一个单独的SOpost 。

更新

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

 [SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})] 

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

在此处输入图像描述

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

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

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

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

这有什么补救措施吗?

@venerik让我走上了正确的道路。 但是,我需要的是[SwaggerOperationFilter] ,而不是[SwaggerOperation]属性,如下所示:

 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 { segment }; } } } 

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

 [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 GetAddress(Guid id, Guid aid) { //do something } 

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

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

 [SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})] public async Task GetAddress(Guid id, Guid aid) { //do something } 

Swagger-UI按标记对操作进行分组,因此, GetAddress将在SubscribersOrganizations