如何通过公共API检测ASP.NET Core自动HTTP 400响应并补充到Swashbuckle生成的OpenAPI规范中
如何通过公共API检测ASP.NET Core自动HTTP 400响应并补充到Swashbuckle生成的OpenAPI规范中
嗨,我来帮你解决这个问题!你之前用反射检测内部类型的方式确实不太稳妥——毕竟ASP.NET Core的内部实现可能会在版本迭代中变化,这样的代码很容易在升级框架后失效。下面是基于框架公共API的可靠实现方案:
核心思路
要判断自动HTTP 400响应是否启用,其实只需要两个关键条件:
- 当前Action是否标记了
[ApiController]特性 - 全局配置中是否没有禁用自动400响应(对应
ApiBehaviorOptions.SuppressModelStateInvalidFilter属性)
这两个都是框架暴露的公共API,完全不需要依赖内部类型。
完整的OperationFilter实现
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.Extensions.Options; using Swashbuckle.AspNetCore.SwaggerGen; using Microsoft.OpenApi.Models; using System.Collections.Generic; public class AutoBadRequestResponseOperationFilter : IOperationFilter { private readonly ApiBehaviorOptions _apiBehaviorOptions; // 通过构造注入获取全局Api行为配置 public AutoBadRequestResponseOperationFilter(IOptions<ApiBehaviorOptions> apiBehaviorOptions) { _apiBehaviorOptions = apiBehaviorOptions.Value; } public void Apply(OpenApiOperation operation, OperationFilterContext context) { // 检查当前Action是否标记了[ApiController] var hasApiControllerAttribute = context.ApiDescription.ActionDescriptor.EndpointMetadata .OfType<ApiControllerAttribute>() .Any(); // 结合全局配置,判断自动400响应是否启用 var isAutoBadRequestEnabled = hasApiControllerAttribute && !_apiBehaviorOptions.SuppressModelStateInvalidFilter; if (isAutoBadRequestEnabled) { // 如果还没有添加400响应定义,就补充进去 if (!operation.Responses.ContainsKey("400")) { operation.Responses.Add("400", new OpenApiResponse { Description = "请求参数验证失败时自动返回的错误响应", Content = new Dictionary<string, OpenApiMediaType> { ["application/json"] = new OpenApiMediaType { Schema = new OpenApiSchema { Type = "object", Properties = new Dictionary<string, OpenApiSchema> { ["type"] = new OpenApiSchema { Type = "string" }, ["title"] = new OpenApiSchema { Type = "string" }, ["status"] = new OpenApiSchema { Type = "integer", Format = "int32" }, ["traceId"] = new OpenApiSchema { Type = "string" }, ["errors"] = new OpenApiSchema { Type = "object", AdditionalProperties = new OpenApiSchema { Type = "array", Items = new OpenApiSchema { Type = "string" } } } } } } } }); } } } }
注册Filter到Swagger
在你的Program.cs(或Startup.cs)中,把这个Filter添加到SwaggerGen的配置里:
builder.Services.AddSwaggerGen(c => { // 注册自定义的OperationFilter c.OperationFilter<AutoBadRequestResponseOperationFilter>(); // 其他Swagger相关配置... });
为什么这个方案更可靠?
- 完全基于框架的公共API,不会因为内部类型变更而失效
- 准确覆盖所有场景:即使你在全局配置中手动设置
SuppressModelStateInvalidFilter = true禁用了自动400,这个Filter也能正确识别并跳过添加响应定义 - 补充的响应Schema和ASP.NET Core默认返回的400响应结构一致,让Swagger文档更贴近实际运行情况
备注:内容来源于stack exchange,提问作者vernou
相关产品推荐
相关产品推荐

