You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过公共API检测ASP.NET Core自动HTTP 400响应并补充到Swashbuckle生成的OpenAPI规范中

如何通过公共API检测ASP.NET Core自动HTTP 400响应并补充到Swashbuckle生成的OpenAPI规范中

嗨,我来帮你解决这个问题!你之前用反射检测内部类型的方式确实不太稳妥——毕竟ASP.NET Core的内部实现可能会在版本迭代中变化,这样的代码很容易在升级框架后失效。下面是基于框架公共API的可靠实现方案:

核心思路

要判断自动HTTP 400响应是否启用,其实只需要两个关键条件:

  1. 当前Action是否标记了[ApiController]特性
  2. 全局配置中是否没有禁用自动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 07:54:32