在web api中获取请求标头

时间:2016-10-07 11:06:18

标签: c# authentication asp.net-web-api request actionfilterattribute

我尝试使用简单的键/值对设置标头,并希望从我的API中读取此标题。 所以这是我来自客户的电话:

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);
}

当我试图在我的动作中读取标题时,我完全得到它(使用我的键/值对)

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

当我尝试使用ActionFilterAttribute和/或IAuthorizationFilter执行此操作时,我的标头始终包含其他键,但从不包含我的键/值对。 这是我的属性:

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;
    }
}

我的目标是,actionfilter检查是否在标题中设置了密钥。如果密钥已设置并验证,我并不总是想检查我的操作,...

我做错了吗?或者有解决方案吗?

1 个答案:

答案 0 :(得分:1)

也许你继承了来自MVC的错误ActionFilterAttribute,而不是Web Api,因为WebApi使用HttpActionContext,而不是ActionExecutingContext,如下所示:

public override void OnActionExecuting(HttpActionContext actionContext)
{
    //code
}

您只需使用WebApi中的System.Web.Http.Filters.ActionFilterAttribute,就可以了。