web-dev-qa-db-fra.com

Obtenir une valeur Request.Headers

Très simple j'en suis sûr, mais me faisant monter le mur! Il y a un composant que j'utilise dans mon application Web qui s'identifie lors d'une demande Web en ajoutant l'en-tête "XYZComponent = true" - le problème que j'ai est, comment vérifiez-vous cela dans votre vue?

Les éléments suivants ne fonctionneront pas:

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

Ni ça:

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

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

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

... tentera de compter le nombre de caractères dans la chaîne retournée, mais si l'en-tête n'existe pas, il renverra NULL, d'où la raison pour laquelle il lève une exception. Votre deuxième exemple fait effectivement la même chose, il recherchera à travers la collection d'en-têtes et retournera NULL s'il n'existe pas, sur lequel vous essayez ensuite de compter le nombre de caractères:

Utilisez-le à 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 ?? renverra une chaîne vide si l'en-tête est nul, ce qui l'arrête en lançant une NullReferenceException.

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

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

Edit: Désolé, je n'avais pas réalisé que vous vérifiiez explicitement la valeur true :

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

Renvoie false si la valeur de l'en-tête est fausse, ou si l'en-tête n'a pas été défini ou si l'en-tête est une autre valeur que true ou false. Renvoie true si la valeur d'en-tête est la chaîne "true"

41
Sunday Ironfoot

L'en-tête existe:

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

ou encore mieux:

string 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 se soucie pas des espaces de début/fin et est insensible à la casse (bool.TryParse fonctionne sur null)

Addon: Vous pouvez rendre cela plus simple avec cette méthode d'extension qui retourne un booléen nullable. Il devrait fonctionner à la fois sur une entrée non valide et sur null.

public static bool? ToBoolean(this string 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, cela ne lèvera pas d'exception sur null - cela peut toutefois prêter à confusion):

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

Tout d'abord, vous ne faites pas cela à votre avis. Vous le faites dans le contrôleur et renvoyez un modèle de vue à la vue afin que la vue n'ait pas besoin de se soucier des en-têtes HTTP personnalisés, mais simplement d'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);
}
3
Darin Dimitrov
if ((Request.Headers["XYZComponent"] ?? "") == "true")
{
    // header is present and set to "true"
}
1
LukeH
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
abatishchev

Le code suivant devrait vous permettre de vérifier l'existence de l'en-tête que vous recherchez Request.Headers :

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