0

Я пытаюсь установить заголовок с помощью простой пары ключ/значение и хочу прочитать это из моего API. Так что это мой вызов от клиента:Получить запрос-заголовок в web 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

Может быть, вы унаследовали неправильный ActionFilterAttribute который приходит от MVC, не веб-Апи, потому что WebAPI использует HttpActionContext, не ActionExecutingContext, как показано ниже:

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

Вы просто использовать с помощью System.Web.Http.Filters.ActionFilterAttribute из WebAPI, это будет хорошо.

+0

Нет, поскольку я использую API с MVC 5. Я использую FilterConfig, который поступает из 'System.Web.Mvc'. Исключение: 'Данный экземпляр фильтра должен реализовать один или несколько из следующих интерфейсов фильтра: System.Web.Mvc.IAuthorizationFilter, System.Web.Mvc.IActionFilter, System.Web.Mvc.IResultFilter, System.Web.Mvc.IExceptionFilter , System.Web.Mvc.Filters.IAuthenticationFilter.' –

+0

Все должно быть от 'System.Web.Http', а не' System.Web.Mvc' –

+0

Я вижу ... теперь он работает. Но тогда шаблон, предоставленный Visual Studio для создания WebApi, неверен ... Пространство имен MVC было по умолчанию –

 Смежные вопросы

  • Нет связанных вопросов^_^