J'ai actuellement un gestionnaire de messages dans mon service 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 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 en- tête de demande personnalisé unique via l' instance HttpRequestMessage
( MSDN Documentation ) transmise à cette méthode remplacée?
c#
asp.net-web-api
httprequest
atconway
la source
la source
request.Headers.Get("MyCustomID");
?Get' on the
type HttpRequestHeaders. Le message: "Impossible de résoudre le symbole 'Get'" est généré.Réponses:
Essayez quelque chose comme ceci:
Il existe également une méthode TryGetValues sur les en-têtes que vous pouvez utiliser si vous n'êtes pas toujours assuré d'avoir accès à l'en-tête.
la source
var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();
Some-Header: one
et puisSome-Header: two
dans la même demande. Certaines langues ignorent silencieusement «un», mais c'est incorrect. C'est dans la RFC mais je suis trop paresseux pour le trouver maintenant.La ligne ci
throws exception
- dessous si la clé n'existe pas.Solution de contournement :
Inclure System.Linq;
la source
Pour développer la réponse de Youssef, j'ai écrit cette méthode en me basant sur les préoccupations de Drew concernant l'en-tête inexistant, car j'ai rencontré cette situation pendant les tests unitaires.
Voici un exemple d'utilisation:
Jetez également un œil à la réponse de @ doguhan-uluca pour une solution plus générale.
la source
Func
etAction
sont des constructions de signature de délégué génériques intégrées à .NET 3.5 et versions ultérieures. Je serais heureux de discuter de questions spécifiques sur la méthode, mais je recommanderais d'abord d'en apprendre davantage.HttpRequestMessage
est initialisé avec une collection d'en-têtes vide, qui n'est pas nulle. Cette fonction finit par renvoyer la valeur par défaut si la requête est nulle.Créez une nouvelle méthode - « Renvoie une valeur d'en-tête HTTP individuelle » et appelez cette méthode avec une valeur de clé à chaque fois que vous devez accéder à plusieurs valeurs de clé à partir de HttpRequestMessage.
la source
Pour développer davantage la solution de @ neontapir, voici une solution plus générique qui peut s'appliquer à HttpRequestMessage ou HttpResponseMessage de la même manière et ne nécessite pas d'expressions ou de fonctions codées à la main.
Exemple d'utilisation:
la source
GetFirstHeaderValueOrDefault
a deux paramètres, donc il se plaint du paramètre manquant lors de l'appel en tant qu'exemple d'utilisationvar myValue = response.GetFirstHeaderValueOrDefault<int>("MyValue");
Suis-je manquant quelque chose?var myValue = myNameSpace.HttpRequestMessageExtension.GetFirstHeaderValueOrDefault<int>("productID");
obtenu Il n'y a pas d'argument donné qui correspond au paramètre formel requis 'headerKey' de 'HttpRequestMessageExtension.GetFirstHeaderValueOrDefault <T> (HttpRequestMessage, string)'using HttpResponseMessageExtensions
sur le fichier que vous essayez d'utiliser cette extension?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].
Informations supplémentaires: Dans mon cas, "myParam" devait être une chaîne, int était toujours 0.
la source
Pour ASP.NET, vous pouvez obtenir l'en-tête directement à partir du paramètre dans la méthode du contrôleur à l'aide de cette bibliothèque / package simple . Il fournit un
[FromHeader]
attribut comme vous l'avez dans ASP.NET Core :). Par exemple:la source
Solution une ligne
la source
request
c'estnull
? C'est également possible. Ou que faire siMyCustomID
une chaîne vide ou non égale àfoo
? Cela dépend du contexte, donc cette réponse décrit simplement la manière, et toute la validation et la logique métier que vous devez ajouter par vous-mêmevariante moderne :)
la source