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

.NET Framework中请求到达控制器前检查请求头的实现方案

.NET Framework Web API 全局请求头校验实现

在.NET Framework Web API里要全局校验请求头,不用每个控制器写重复代码,有两种靠谱的实现方式:

方法一:用DelegatingHandler(管道级拦截)

这是最接近.NET Core中间件的实现,在请求进入控制器之前的管道阶段就做校验,所有API请求都会经过这里。

  1. 创建自定义Handler类:
public class RequiredHeaderHandler : DelegatingHandler
{
    private const string RequiredHeaderName = "Your-Required-Header"; // 替换成你要校验的头名

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // 检查请求头是否存在
        if (!request.Headers.Contains(RequiredHeaderName))
        {
            return request.CreateErrorResponse(HttpStatusCode.PreconditionFailed, "缺少必填请求头");
        }

        // 校验通过,继续传递请求
        return await base.SendAsync(request, cancellationToken);
    }
}
  1. 在WebApiConfig里注册这个Handler:
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 注册自定义Handler
        config.MessageHandlers.Add(new RequiredHeaderHandler());

        // 其他Web API配置(路由、格式化等)
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

方法二:用全局ActionFilter(控制器动作级拦截)

这种方式是在路由匹配完成、控制器动作执行之前做校验,适合需要和控制器上下文交互的场景。

  1. 创建自定义Filter类:
public class RequiredHeaderFilter : ActionFilterAttribute
{
    private const string RequiredHeaderName = "Your-Required-Header";

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.Request.Headers.Contains(RequiredHeaderName))
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.PreconditionFailed, "缺少必填请求头");
        }

        base.OnActionExecuting(actionContext);
    }
}
  1. 在WebApiConfig里全局注册Filter:
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 全局注册Filter
        config.Filters.Add(new RequiredHeaderFilter());

        // 其他Web API配置
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

两种方式的区别

  • DelegatingHandler:拦截时机更早,甚至在路由匹配之前,所有发往API的请求都会被拦截,包括不符合路由规则的请求。
  • ActionFilter:拦截时机稍晚,只有匹配到路由的请求才会进入校验,能直接访问控制器和动作的上下文信息。

你可以根据自己的需求选其中一种,两种都能实现全局校验,不用在每个控制器里写重复的检查代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:30:43