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