Obtenir une valeur Request.Headers

Très simple, j’en suis sûr, mais me conduit au mur! Un composant que j’utilise dans mon application Web et qui s’identifie lors d’une demande Web en ajoutant l’en-tête “XYZComponent = true” – le problème que je rencontre est le suivant: comment vérifier cela à votre avis?

Ce qui suit ne fonctionnera pas:

if (Request.Headers["XYZComponent"].Count() > 0) 

Ni ceci:

 if (Request.Headers.AllKeys.Where(k => k == "XYZComponent").Count() > 0) 

Les deux lèvent des exceptions si la variable d’en-tête n’a pas été définie. Toute aide serait appréciée.

 if (Request.Headers["XYZComponent"].Count() > 0) 

… tentera de compter le nombre de caractères dans la chaîne renvoyée, mais si l’en-tête n’existe pas, il retournera NULL, d’où la raison pour laquelle une exception est levée. Votre deuxième exemple fait effectivement la même chose, il recherchera dans la collection d’En-têtes et retournera NULL s’il n’existe pas. Vous tenterez ensuite de compter le nombre de caractères sur:

Utilisez ceci à la place:

 if(Request.Headers["XYZComponent"] != null) 

Ou si vous souhaitez traiter les chaînes vides ou vides comme non définies, utilisez:

 if((Request.Headers["XYZComponent"] ?? "").Trim().Length > 0) 

L’opérateur Null Coalesce ?? retournera une chaîne vide si l’en-tête est null, l’empêchant de lancer une exception NullReferenceException.

Une variante de votre deuxième tentative fonctionnera également:

 if (Request.Headers.AllKeys.Any(k => ssortingng.Equals(k, "XYZComponent"))) 

Edit: Désolé de ne pas avoir réalisé que vous recherchiez explicitement la valeur true :

 bool isSet = Boolean.TryParse(Request.Headers["XYZComponent"], out isSet) && isSet; 

Renverra false si la valeur de l’en-tête est false ou si l’en-tête n’a pas été défini ou si l’en-tête est une valeur autre que true ou false. Retourne true si la valeur de l’en-tête est la chaîne ‘true’

L’en-tête existe:

 if (Request.Headers["XYZComponent"] != null) 

ou même mieux:

 ssortingng xyzHeader = Request.Headers["XYZComponent"]; bool isXYZ; if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ) 

qui vérifiera si elle est définie sur true. Cela devrait être infaillible, car il ne tient pas compte des espaces de bool.TryParse / fin et ne respecte pas la casse ( bool.TryParse fonctionne avec la valeur null ).

Addon: Vous pouvez simplifier cela avec cette méthode d’extension qui renvoie un booléen nullable. Cela devrait fonctionner à la fois sur une entrée invalide et sur null.

 public static bool? ToBoolean(this ssortingng s) { bool result; if (bool.TryParse(s, out result)) return result; else return null; } 

Utilisation (car il s’agit d’une méthode d’extension et non d’une méthode d’instance, cette exception ne lève pas d’exception, elle risque toutefois de prêter à confusion):

 if (Request.Headers["XYZComponent"].ToBoolean() == true) 

Premièrement, vous ne le faites pas à votre avis. Vous le faites dans le contrôleur et renvoyez un modèle de vue à la vue afin que celle-ci n’ait pas à se soucier des en-têtes HTTP personnalisés, mais simplement à afficher des données sur le modèle de vue:

 public ActionResult Index() { var xyzComponent = Request.Headers["xyzComponent"]; var model = new MyModel { IsCustomHeaderSet = (xyzComponent != null) } return View(model); } 
 if ((Request.Headers["XYZComponent"] ?? "") == "true") { // header is present and set to "true" } 
 ssortingng strHeader = Request.Headers["XYZComponent"] bool bHeader = Boolean.TryParse(strHeader, out bHeader ) && bHeader; if "true" than true if "false" or anything else ("fooBar") than false 

ou

 ssortingng strHeader = Request.Headers["XYZComponent"] bool b; bool? bHeader = Boolean.TryParse(strHeader, out b) ? b : default(bool?); if "true" than true if "false" than false else ("fooBar") than null 

Le code suivant devrait vous permettre de vérifier l’existence de l’en-tête recherché dans Request.Headers :

 if (Request.Headers.AllKeys.Contains("XYZComponent")) { // Can now check if the value is true: var value = Convert.ToBoolean(Request.Headers["XYZComponent"]); }