C# 在多个组下列出API方法

C# 在多个组下列出API方法,c#,asp.net-web-api,asp.net-core,swagger,swashbuckle,C#,Asp.net Web Api,Asp.net Core,Swagger,Swashbuckle,我有一个带Swashback注释的代码,如下所示: [Route("api/Subscribers/{id}/[controller]")] [Route("api/Organizations/{id}/[controller]")] public class AddressesController : Controller { [HttpGet("{aid}")] [SwaggerResponse(HttpStatusCode.OK, Type = typeof(PostalR

我有一个带Swashback注释的代码,如下所示:

[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
    }
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 };
        }
    }
}
换句话说,我希望相同的方法列在以下两项下:

  • 订户
  • 组织机构
如何做到这一点?

顺便说一句,我正在使用ASP.NET核心(
dnx46
)。如果在Swashbucklee的ASP.NET核心版本中还不能实现这一点,那么仍然需要一个完整的CLR(Web API 2.2?)示例

另外,为了更完整地了解我正在尝试做的事情,我有一个

更新 @venerik给出的答案让我接近了答案。当我应用他的示例代码时

[SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})]
…这会导致招摇过市的列表如下所示:

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

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

我怀疑[SwaggerOperationFilter]可能是答案的“另一半”,如果我能让它删除交叉列出的条目。我以前从未玩过这种机制

焦虑 此外,非常不幸的是,[SwaggerOperation]只能应用于方法/操作。我更愿意将其应用于课堂本身:

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

有什么补救办法吗?

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

[SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
   //do something
}
[SwaggerOperation(Tags=new[]{“订阅者”、“组织”}]
公共异步任务GetAddress(Guid id,Guid辅助)
{
//做点什么
}

Swagger UI按标签对操作进行分组,因此,
GetAddress
将同时列在
订阅者
组织

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

[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
    }
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 };
        }
    }
}
公共类分类过滤器:IOperationFilter
{
公共无效应用(操作,操作筛选器上下文)
{
字符串路径=context.apiscription.RelativePath;
字符串段=path.Split('/')[1];
if(段!=context.apiscription.GroupName)
{
operation.Tags=新列表{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
    }
[路由(“api/Subscribers/{id}/[controller]”)
[路由(“api/Organizations/{id}/[controller]”)
公共类地址控制器:控制器
{
[HttpGet(“{aid}”)]
[SwaggerOperationFilter(类型(分类过滤器))]
[SwaggerResponse(HttpStatusCode.OK,Type=typeof(PostalRecord))]
公共异步任务GetAddress(Guid id,Guid辅助)
{
//做点什么
}

结果,“地址”类别从我的招摇过市UI中完全消失了(很好!),两组端点路由在“组织”和“订阅者”之间正确划分groups.Perfect!

我已经根据您非常有用的输入更新了我的问题。太棒了!!是否可以从任何json或文本文件中获取订阅者和组织?是的,它可以工作,但一个主要缺点是,无论何时创建新合同,都必须在swagger中的category filter类中添加一个新块。换句话说,您可以必须在2个不同的项目中进行更改。我想使用[SwaggerOperation(Tags=new[]{“订阅者”、“组织”})]属性来代替它。