Получить заголовок запроса в веб-API

Я пытаюсь установить заголовок с простой парой ключ/значение и хочу прочитать это из своего 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;
    }
}

Моя цель в том, что фильтр действий проверяет, установлен ли ключ в заголовке или нет. Я не всегда хочу проверять свое действие, если ключ установлен и проверять его,...

Я делаю что-то неправильно? Или есть решение для этого?


person Matthias Burger    schedule 07.10.2016    source источник


Ответы (1)


Возможно, вы унаследовали неправильный ActionFilterAttribute, который исходит от MVC, а не Web Api, потому что WebApi использует HttpActionContext, а не ActionExecutingContext, как показано ниже:

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

Вы просто используете использование System.Web.Http.Filters.ActionFilterAttribute из WebApi, все будет в порядке.

person cuongle    schedule 07.10.2016
comment
нет, так как я использую API с MVC 5. Я использую FilterConfig, который исходит от System.Web.Mvc. Исключение: The given filter instance must implement one or more of the following filter interfaces: System.Web.Mvc.IAuthorizationFilter, System.Web.Mvc.IActionFilter, System.Web.Mvc.IResultFilter, System.Web.Mvc.IExceptionFilter, System.Web.Mvc.Filters.IAuthenticationFilter. - person Matthias Burger; 07.10.2016
comment
Все должно быть от System.Web.Http, а не System.Web.Mvc - person cuongle; 07.10.2016
comment
Я вижу... теперь это работает. Но тогда шаблон, предоставленный Visual Studio для создания WebApi, неверен... MVC-пространство имен было по умолчанию - person Matthias Burger; 07.10.2016