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)
这有什么补救措施吗?
我还没有使用 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
}
Run Code Online (Sandbox Code Playgroud)
Swagger-UI 按标签对操作进行分组,因此,将在和GetAddress下列出。SubscribersOrganizations
@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中消失(好!),并且两组端点路由在"组织"和"订阅者"组之间正确划分.完善!
| 归档时间: |
|
| 查看次数: |
6142 次 |
| 最近记录: |