我有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列表看起来像这样:
简而言之,&#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
{
对此有任何补救措施吗?
答案 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
实现此目的。您可以使用此属性向操作添加标记。例如,下一段代码会添加标记Subscribers
和Organizations
:
[SwaggerOperation(Tags = new []{"Subscribers", "Organizations"})]
public async Task<IActionResult> GetAddress(Guid id, Guid aid)
{
//do something
}
Swagger-UI按标记对操作进行分组,因此GetAddress
将列在Subscribers
和Organizations
下。