0

J'essaie de définir un en-tête avec une simple paire clé/valeur et je souhaite le lire depuis mon API. C'est donc mon appel du client:Obtenir l'en-tête de la requête dans l'API web

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

quand je suis en train de lire l'en-tête dans mon action, je reçois complètement (avec ma clé/valeur paire)

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

quand J'essaye de faire ceci avec le ActionFilterAttribute et/ou le IAuthorizationFilter mon en-tête contient toujours d'autres clefs, mais ne contient jamais ma paire key/value. Ceci est mon Attribut:

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

Mon objectif est que les contrôles de ActionFilter si la clé est situé dans l'en-tête ou non. Je ne veux pas toujours vérifier mon action si la clé est réglée et la valider, ...

Est-ce que je fais quelque chose de mal? Ou y a-t-il une solution pour le faire?

Répondre

1

Peut-être que vous avez hérité le mauvais ActionFilterAttribute qui vient de MVC, non Web APIs car WebAPI utilise HttpActionContext, pas ActionExecutingContext comme ci-dessous:

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

Vous utilisez juste en utilisant System.Web.Http.Filters.ActionFilterAttribute de WebAPI, ce sera bien.

+0

non, puisque j'utilise l'API avec MVC 5. J'utilise le FilterConfig qui vient de 'System.Web.Mvc'. L'exception est la suivante: 'L'instance de filtre donnée doit implémenter une ou plusieurs des interfaces de filtre suivantes: System.Web.Mvc.IAuthorizationFilter, System.Web.Mvc.IActionFilter, System.Web.Mvc.IResultFilter, System.Web.Mvc.IExceptionFilter , System.Web.Mvc.Filters.IAuthenticationFilter.' –

+0

Tout devrait être de 'System.Web.Http', pas' System.Web.Mvc' –

+0

Je vois ... maintenant ça marche. Mais alors, le modèle fourni par Visual Studio pour créer un WebApi est faux ... MVC-namespace était par défaut –