如何从Swagger中排除BaseController的DuplicateAsync动作?
解决Swagger重复解析基类控制器动作的问题
方法一:直接添加忽略特性
给DuplicateAsync方法加上[ApiExplorerSettings(IgnoreApi = true)]特性,这会告诉Swagger依赖的ApiExplorer组件直接忽略该接口,不将其纳入文档生成范围。
修改后的代码示例:
[HttpGet("Duplicate/{dup}")] [ApiExplorerSettings(IgnoreApi = true)] public async Task<IActionResult> DuplicateAsync(string dup) { if (DuplicateIdRegEx().IsMatch(dup)) { if (int.TryParse(dup.AsSpan(1), out int id)) return await EditAsync(id, true); } return NotFound(); }
方法二:自定义Swagger文档过滤器
如果不想修改基类代码,可以通过自定义过滤器过滤掉目标动作:
- 创建过滤器类,实现
IDocumentFilter接口:
public class IgnoreBaseControllerDuplicateActionFilter : IDocumentFilter { public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { var baseControllerType = typeof(BaseController); var pathsToRemove = new List<string>(); foreach (var (pathKey, pathItem) in swaggerDoc.Paths) { foreach (var (_, operation) in pathItem.Operations) { var apiDesc = context.ApiDescriptions.FirstOrDefault(d => d.RelativePath == pathKey && d.HttpMethod == operation.OperationId.Split('_')[0]); var actionDesc = apiDesc?.ActionDescriptor as ControllerActionDescriptor; if (actionDesc != null && actionDesc.ControllerTypeInfo.BaseType == baseControllerType && actionDesc.ActionName == nameof(BaseController.DuplicateAsync)) { pathsToRemove.Add(pathKey); break; } } } foreach (var path in pathsToRemove) { swaggerDoc.Paths.Remove(path); } } }
- 在Swagger配置中注册过滤器(以.NET 6+的Program.cs为例):
builder.Services.AddSwaggerGen(c => { c.DocumentFilter<IgnoreBaseControllerDuplicateActionFilter>(); // 其他Swagger配置项 });
内容的提问来源于stack exchange,提问作者jstuardo
相关产品推荐
相关产品推荐

