176 votes

Comment extraire la valeur d'un en-tête personnalisé dans le gestionnaire de messages de l'API Web ?

J'ai actuellement un gestionnaire de messages dans mon service d'API Web qui remplace "SendAsync" comme suit :

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
  //implementation
}

Dans ce code, je dois inspecter une valeur d'en-tête de demande ajoutée personnalisée nommée MyCustomID . Le problème est que lorsque je fais ce qui suit :

if (request.Headers.Contains("MyCustomID"))  //OK
    var id = request.Headers["MyCustomID"];  //build error - not OK

...je reçois le message d'erreur suivant :

Impossible d'appliquer l'indexation avec [] à une expression de type System.Net.Http.Headers.HttpRequestHeaders'.

Comment puis-je accéder à un simple l'en-tête de demande personnalisé via l'en-tête HttpRequestMessage ( Documentation MSDN ) passée dans cette méthode surchargée ?

0 votes

Que se passe-t-il si vous utilisez request.Headers.Get("MyCustomID"); ?

3 votes

Il n'y a pas Get' on the Type "HttpRequestHeaders". Le message : "Cannot resolve symbol 'Get'" est produit.

8voto

MegaTron Points 3484

Solution en une ligne (en supposant que l'en-tête existe)

var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();

6voto

lawrenceagbani Points 137

Pour ASP.NET, vous pouvez obtenir l'en-tête directement du paramètre dans la méthode du contrôleur en utilisant cette simple bibliothèque/paquet . Il fournit un [FromHeader] comme vous le faites dans ASP.NET Core :). Par exemple :

    ...
    using RazHeaderAttribute.Attributes;

    [Route("api/{controller}")]
    public class RandomController : ApiController 
    {
        ...
        // GET api/random
        [HttpGet]
        public IEnumerable<string> Get([FromHeader("pages")] int page, [FromHeader] string rows)
        {
            // Print in the debug window to be sure our bound stuff are passed :)
            Debug.WriteLine($"Rows {rows}, Page {page}");
            ...
        }
    }

4voto

Reiner Points 1017

Pour ASP.Net Core, il existe une solution simple si vous souhaitez utiliser le paramètre directement dans la méthode du contrôleur : Utilisez l'annotation [FromHeader].

        public JsonResult SendAsync([FromHeader] string myParam)
        {
        if(myParam == null)  //Param not set in request header
        {
           return null;
        }
        return doSomething();
    }   

Info supplémentaire : Dans mon cas, le "myParam" devait être une chaîne de caractères, int était toujours 0.

3voto

request.Headers.FirstOrDefault( x => x.Key == "MyCustomID" ).Value.FirstOrDefault()

variante moderne :)

0voto

tno2007 Points 41

Cela peut sembler évident, mais assurez-vous que le contrôleur dans lequel vous lisez les en-têtes, est le contrôleur premièrement Contrôleur où la demande passe.

J'avais deux projets WebAPI qui communiquaient entre eux. Le premier était un proxy, le second contenait la logique. J'ai été stupide et j'ai essayé de lire les en-têtes personnalisés dans le second contrôleur, au lieu du premier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X