我希望能够使用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
不一样。
如何为调试目的注入标头?
答案 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
时,一只小猫就会死掉。