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

如何在ASP.NET Core Web API的Swashbuckle中添加自定义请求头?

我之前刚好处理过一模一样的需求,给你几个实用的方案,帮你把orgid、brnid这类自定义请求头加到Swagger文档里,还能支持调试时直接输入:

方法一:全局添加(所有接口自动生效)

如果你的所有API接口都需要这两个自定义头,用这个方法最省心。我们可以写一个操作过滤器,让Swagger自动给所有接口加上这两个请求头配置。

在你的Program.cs(.NET 6+)或者Startup.cs里,找到AddSwaggerGen的配置代码,添加如下内容:

builder.Services.AddSwaggerGen(c =>
{
    // 保留你原来的JWT认证配置
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Name = "Authorization",
        Type = SecuritySchemeType.Http,
        Scheme = "Bearer",
        BearerFormat = "JWT",
        In = ParameterLocation.Header,
        Description = "JWT授权头格式:Bearer {token}"
    });

    // 注册自定义操作过滤器
    c.OperationFilter<CustomHeaderOperationFilter>();
});

// 自定义操作过滤器类
public class CustomHeaderOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        // 初始化参数列表(防止null)
        if (operation.Parameters == null)
            operation.Parameters = new List<OpenApiParameter>();

        // 添加orgid请求头
        operation.Parameters.Add(new OpenApiParameter
        {
            Name = "orgid",
            In = ParameterLocation.Header,
            Required = true, // 设为true表示必填,可选则改为false
            Schema = new OpenApiSchema
            {
                Type = "string",
                Default = new OpenApiString("fe5mp0") // 设置默认值,方便调试
            },
            Description = "组织ID,用于请求验证"
        });

        // 添加brnid请求头
        operation.Parameters.Add(new OpenApiParameter
        {
            Name = "brnid",
            In = ParameterLocation.Header,
            Required = true,
            Schema = new OpenApiSchema
            {
                Type = "string",
                Default = new OpenApiString("NY0023")
            },
            Description = "分支ID,用于请求验证"
        });
    }
}

配置完之后,启动项目打开Swagger页面,所有接口的调试区域都会自动出现这两个请求头的输入框,默认值已经填好,直接就能测试。

方法二:按需添加(针对单个接口/控制器)

如果不是所有接口都需要这两个头,我们可以用自定义注解的方式,灵活控制哪些接口需要添加。

第一步:定义自定义注解

先写一个Attribute类,用来标记需要自定义头的接口:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = false)]
public class RequiredCustomHeadersAttribute : Attribute
{
    public string[] Headers { get; }

    // 支持传入多个头名称
    public RequiredCustomHeadersAttribute(params string[] headers)
    {
        Headers = headers;
    }
}

第二步:修改操作过滤器

让过滤器识别这个注解,只给标记过的接口添加请求头:

public class CustomHeaderOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        // 先检查方法上有没有注解,没有就检查控制器上的
        var requiredHeaders = context.MethodInfo.GetCustomAttribute<RequiredCustomHeadersAttribute>()
                             ?? context.MethodInfo.DeclaringType?.GetCustomAttribute<RequiredCustomHeadersAttribute>();

        // 如果没有标记,直接返回
        if (requiredHeaders == null || requiredHeaders.Headers.Length == 0)
            return;

        if (operation.Parameters == null)
            operation.Parameters = new List<OpenApiParameter>();

        foreach (var headerName in requiredHeaders.Headers)
        {
            // 根据头名称设置默认值和描述
            var defaultValue = headerName switch
            {
                "orgid" => "fe5mp0",
                "brnid" => "NY0023",
                _ => null
            };

            var description = headerName switch
            {
                "orgid" => "组织ID",
                "brnid" => "分支ID",
                _ => "自定义验证头"
            };

            operation.Parameters.Add(new OpenApiParameter
            {
                Name = headerName,
                In = ParameterLocation.Header,
                Required = true,
                Schema = new OpenApiSchema
                {
                    Type = "string",
                    Default = defaultValue != null ? new OpenApiString(defaultValue) : null
                },
                Description = description
            });
        }
    }
}

第三步:标记需要的接口/控制器

在控制器或者单个接口方法上添加注解即可:

// 整个控制器的所有接口都需要这两个头
[ApiController]
[Route("api/orders")]
[RequiredCustomHeaders("orgid", "brnid")]
public class OrdersController : ControllerBase
{
    // 单个方法只需要orgid
    [HttpGet("{id}")]
    [RequiredCustomHeaders("orgid")]
    public IActionResult GetOrder(int id)
    {
        // 业务逻辑
        return Ok();
    }
}
额外提醒:别忘了验证请求头

Swagger里显示了请求头只是方便调试,真正的验证逻辑还需要你自己实现。比如可以写一个Action过滤器,在请求到达接口之前读取并验证orgid和brnid的合法性:

public class CustomHeaderValidationFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.HttpContext.Request.Headers.TryGetValue("orgid", out var orgid) || orgid != "fe5mp0")
        {
            context.Result = new UnauthorizedObjectResult("无效的orgid");
            return;
        }

        if (!context.HttpContext.Request.Headers.TryGetValue("brnid", out var brnid) || brnid != "NY0023")
        {
            context.Result = new UnauthorizedObjectResult("无效的brnid");
            return;
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // 无需处理
    }
}

然后在Program.cs里注册这个过滤器:

builder.Services.AddControllers(options =>
{
    options.Filters.Add<CustomHeaderValidationFilter>();
});

内容的提问来源于stack exchange,提问作者Nitesh Shaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:44:40