Matthias Burger Matthias Burger - 11 months ago 133
C# Question

Get request-header in web api

I'm trying to set a header with a simple key/value-pair and want to read this from my API.
So this is my call from client:

public async Task<T> Auth_GetAsync<T>(string path)
var client = BaseHttpClient;
var request = new HttpRequestMessage
RequestUri = new Uri(Path.Combine(client.BaseAddress.AbsoluteUri, path)),
Method = HttpMethod.Get,
Headers = { {"key", "param"} }
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(RequestHeader));
var task = await client.SendAsync(request);
return task.IsSuccessStatusCode
? JsonConvert.DeserializeObject<T>(await task.Content.ReadAsStringAsync())
: default(T);

when I'm trying to read the header in my action, I get it completely (with my key/value-pair)

public async Task<IEnumerable<string>> GetAsync()
var i = Request.Headers;
return await Task.Run(() => new[] { "value1", "value2" });

when I'm trying to do this with the ActionFilterAttribute and/or the IAuthorizationFilter my header always contains other keys, but never contains my key/value-pair.
This is my Attribute:

public class RequiresKeyAttribute : ActionFilterAttribute, IAuthorizationFilter
public override void OnActionExecuting(ActionExecutingContext filterContext)
var req = filterContext.HttpContext.Request;
var auth = req.Headers["key"]; // this is null here

public void OnAuthorization(AuthorizationContext filterContext)
var i = filterContext.HttpContext.Request.Headers;

My target is, that the actionfilter checks whether the key is set in the header or not. I don't always want to check in my action if the key is set and validate it,...

Am I doing something wrong? Or is there solution to do this?

Answer Source

Maybe you inherited the wrong ActionFilterAttribute which comes from MVC, not Web Api because WebApi uses HttpActionContext, not ActionExecutingContext like below:

public override void OnActionExecuting(HttpActionContext actionContext)

You just use using System.Web.Http.Filters.ActionFilterAttribute from WebApi, it will be fine.