如何全局配置Swagger UI显示所有可能的HTTP响应?
全局配置Swagger显示多HTTP响应状态码方案
不用在每个控制器方法上逐个加[ProducesResponseType]注解,下面是几种全局配置的实现方式:
方法一:通过IDocumentFilter批量注入响应状态码
实现Swagger的IDocumentFilter接口,遍历所有API操作,批量添加你需要的响应状态码(比如401、404、500等)。
代码示例:
public class GlobalResponseFilter : IDocumentFilter { public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { // 遍历所有API路径和操作 foreach (var pathItem in swaggerDoc.Paths.Values) { foreach (var operation in pathItem.Operations.Values) { // 添加401未授权响应 operation.Responses.TryAdd("401", new OpenApiResponse { Description = "未授权访问" }); // 添加404资源不存在响应 operation.Responses.TryAdd("404", new OpenApiResponse { Description = "请求的资源不存在" }); // 添加500服务器内部错误响应(对应全局异常处理的兜底错误) operation.Responses.TryAdd("500", new OpenApiResponse { Description = "服务器内部错误" }); } } } }
然后在Swagger配置里注册这个过滤器:
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Your API", Version = "v1" }); // 注册全局响应过滤器 c.DocumentFilter<GlobalResponseFilter>(); });
方法二:自定义IApiDescriptionProvider扩展API描述
这个方法是在API描述生成阶段,直接给所有ApiDescription添加响应类型,比DocumentFilter更贴近ASP.NET Core的API元数据体系。
代码示例:
public class GlobalResponseProvider : IApiDescriptionProvider { public int Order => -1000; // 确保在默认提供者之后执行 public void OnProvidersExecuting(ApiDescriptionProviderContext context) { // 这里可以提前处理,不过通常用OnProvidersExecuted } public void OnProvidersExecuted(ApiDescriptionProviderContext context) { foreach (var apiDescription in context.Results) { // 添加401响应类型 apiDescription.SupportedResponseTypes.Add(new ApiResponseType { StatusCode = StatusCodes.Status401Unauthorized, Type = typeof(ProblemDetails) // 对应全局异常返回的错误模型 }); // 添加404响应类型 apiDescription.SupportedResponseTypes.Add(new ApiResponseType { StatusCode = StatusCodes.Status404NotFound, Type = typeof(ProblemDetails) }); } } }
然后在Startup/Program.cs里注册这个服务:
services.TryAddEnumerable(ServiceDescriptor.Transient<IApiDescriptionProvider, GlobalResponseProvider>());
方法三:结合全局异常处理的状态码映射自动添加
如果你的全局异常处理类里已经定义了异常类型到HTTP状态码的映射(比如UnauthorizedException→401,NotFoundException→404),可以在过滤器里读取这些映射,动态添加对应响应:
代码示例(假设你有一个全局异常映射类ExceptionStatusCodeMapping):
public class ExceptionBasedResponseFilter : IDocumentFilter { private readonly Dictionary<Type, int> _exceptionStatusCodeMap; public ExceptionBasedResponseFilter(ExceptionStatusCodeMapping mapping) { _exceptionStatusCodeMap = mapping.Mappings; } public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { foreach (var pathItem in swaggerDoc.Paths.Values) { foreach (var operation in pathItem.Operations.Values) { foreach (var (exceptionType, statusCode) in _exceptionStatusCodeMap) { var statusCodeStr = statusCode.ToString(); if (!operation.Responses.ContainsKey(statusCodeStr)) { operation.Responses.Add(statusCodeStr, new OpenApiResponse { Description = exceptionType.Name.Replace("Exception", "") + "错误" }); } } } } } }
注册时注入映射类即可:
services.AddSwaggerGen(c => { c.DocumentFilter<ExceptionBasedResponseFilter>(); });
内容的提问来源于stack exchange,提问作者Amentos
相关产品推荐
相关产品推荐

