.NET Framework中请求到达控制器前检查请求头的实现方案
.NET Framework Web API 全局请求头校验实现
在.NET Framework Web API里要全局校验请求头,不用每个控制器写重复代码,有两种靠谱的实现方式:
方法一:用DelegatingHandler(管道级拦截)
这是最接近.NET Core中间件的实现,在请求进入控制器之前的管道阶段就做校验,所有API请求都会经过这里。
- 创建自定义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); } }
- 在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(控制器动作级拦截)
这种方式是在路由匹配完成、控制器动作执行之前做校验,适合需要和控制器上下文交互的场景。
- 创建自定义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); } }
- 在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
相关产品推荐
相关产品推荐

