在多个组

时间:2016-04-09 23:18:01

标签: c# asp.net-web-api asp.net-core swagger swashbuckle

我有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
    }

我想使用GroupActionsBy customization, as shown in this example,但我想将上述GetAddress方法同时包含在两个独立的组中,这些组对应于显示的两个路由前缀:

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

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

  • 订户
  • 组织

如何做到这一点?

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

另外,有关我尝试做的更完整的故事 - 我有一个separate SO post

更新

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

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

...这会使Swagger列表看起来像这样:

enter image description here

简而言之,&#34;地址&#34;端点现在出现在我想要的标题下,但正如红色箭头所示,它们现在也正在交叉列出&#34 ;;我不想要&#34;订阅者&#34;端点列在&#34;组织&#34;端点。

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

焦虑

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

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

对此有任何补救措施吗?

2 个答案:

答案 0 :(得分: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 };
        }
    }
}

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

[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
    }

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

答案 1 :(得分:4)

我没有使用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
}

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