ActionFilterAttribute添加的标题不会出现在ApiController中

时间:2016-01-04 10:12:19

标签: c# asp.net-web-api

我希望能够使用ActionFilterAttribute将标头注入WebApi控制器方法上下文:

public class HeaderInjectionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        actionContext.Request.Headers.Add("test", "test");  
        base.OnActionExecuting(actionContext);
    }
}

并在控制器中使用它

[HeaderInjectionFilter]
public class MotionTypeController : ApiController
{
    public bool Get()
    {
        // will return false
        return HttpContext.Current.Request.Headers.AllKeys.Contains("test");        
    }
}

正如我在评论中所说,过滤器注入的标题不会是HttpContext.Current的一部分。当我在属性的OnActionExecuting的最后一行设置断点时,我可以看到它在请求标题中包含标题值。

如果我将控制器更改为

public class MotionTypeController : ApiController
{
    public bool Get()
    {
        HttpContext.Current.Request.Headers.Add("test", "test");
        // will return true
        return HttpContext.Current.Request.Headers.AllKeys.Contains("test");        
    }
}

一切都会有效,所以我猜actionContext的{​​{1}}与控制器的OnActionExecuting不一样。

如何为调试目的注入标头?

1 个答案:

答案 0 :(得分:4)

  

正如我在评论中所说,过滤器注入的标题会   不属于HttpContext.Current

那是因为您已将其添加到actionContext.Request.Headers集合中。因此,请确保您正在寻找添加它的地方:

[HeaderInjectionFilter]
public class MotionTypeController : ApiController
{
    public bool Get()
    {
        return this.Request.Headers.GetValues("test").Any();
    }
}

忘了HttpContext.Current。把它想象成不存在的东西。每当有人在ASP.NET应用程序中使用HttpContext.Current时,一只小猫就会死掉。