26

Très simple, je suis sûr, mais me conduire le mur! Il y a un composant que j'utilise dans mon application web qui s'identifie lors d'une requête web en ajoutant l'entête "XYZComponent = true" - le problème que je rencontre est, comment vérifiez-vous cela à votre avis?Obtenir un Request.Headers valeur

Les travaux wont suivants:

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

Ni ceci:

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

Les deux exceptions throw si la variable d'en-tête n'a pas été réglée. Toute aide sera très appréciée.

+0

Je ne sais pas si MVC encapsule la fonctionnalité mais dans HTTP lui-même les en-têtes sont de la forme "XYZComponent: true". Je ne fais que commencer si vous avez réussi à définir un en-tête comme "XYZComponent = true:" (c'est-à-dire que toute la chaîne que vous avez citée est le nom et donc ce que vous devez vérifier. pour itérer à travers les touches ... – Chris

Répondre

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

... sera tenté de compter le nombre de caractères dans la chaîne retournée, mais si l'en-tête n'existe pas, il retournera NULL, c'est pourquoi il lance une exception. Votre deuxième exemple réalise effectivement la même chose, il va chercher à travers la collection de têtes et retourne NULL si elle n'existe pas, que vous essayez ensuite de compter le nombre de caractères:

Utilisez ce lieu:

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

ou si vous voulez traiter les chaînes vides ou vides ne pas cochés alors utiliser:

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

L'opérateur nul Coalesce ?? retournera une chaîne vide si l'en-tête est null, l'arrêtant en lançant une exception NullReferenceException.

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

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

Edit: Désolé ne savais pas que vous vérifiez explicitement la valeur vrai:

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

Renvoie false si la valeur de l'en-tête est false ou si Header n'a pas été défini ou si Header est une valeur autre que vrai ou faux. Retourne vrai est la valeur d'en-tête est la chaîne « true »

8

tête existe:

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

ou mieux encore:

string xyzHeader = Request.Headers["XYZComponent"]; 
bool isXYZ; 

if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ) 

qui va vérifier si elle est définie sur true. Cela devrait être infaillible parce qu'il ne se soucie pas sur les espaces de premier plan/arrière et est insensible à la casse (bool.TryParse fonctionne sur null)

Addon: Vous pouvez le rendre plus simple avec cette méthode d'extension qui renvoie une annulable booléen Cela devrait fonctionner à la fois sur une entrée invalide et sur null.

public static bool? ToBoolean(this string s) 
{ 
    bool result; 

    if (bool.TryParse(s, out result)) 
     return result; 
    else 
     return null; 
} 

Utilisation (ce ne sera pas jeter une exception sur null parce que c'est une méthode d'extension et non méthode d'instance - il peut être source de confusion, cependant):

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

Tout d'abord vous ne le faites pas à votre avis. Vous le faites dans le contrôleur et le retour d'un modèle en vue de la vue afin que la vue n'a pas besoin de 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); 
} 
1
if ((Request.Headers["XYZComponent"] ?? "") == "true") 
{ 
    // header is present and set to "true" 
} 
+0

Il est un cas insensible comparer, car il pourrait être XYZComponent: True ou XYZComponent: TRUE Try (Request.Headers ["XYZComponent"] ?? "") .Equals ("true", StringComparison .InvariantCultureIgnoreCase) –

+2

@Sunday: Dans la mesure où le protocole HTTP utilise toujours l'anglais, vous devez utiliser 'StringComparison.OrdinalIgnoreCase' qui est brut, octet par octet, comparaison. Voir plus dans le fil dans http://lists.ximian.com/pipermail/ mono-list/2010-juillet/045508.html – abatishchev

1
string 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

string 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 
1

Le code suivant devrait vous permettre de vérifier l'existance de l'en-tête que vous êtes après dans Request.Headers:

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