webentwicklung-frage-antwort-db.com.de

Request.Headers-Wert abrufen

Ganz einfach, da bin ich mir sicher, aber fahr mich die Wand hoch! Es gibt eine Komponente, die ich in meiner Webanwendung verwende und die sich während einer Webanforderung durch Hinzufügen des Headers "XYZComponent = true" identifiziert - das Problem ist, wie überprüfen Sie dies Ihrer Ansicht nach?

Folgendes funktioniert nicht:

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

Noch dies:

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

Beide lösen Ausnahmen aus, wenn die Header-Variable nicht gesetzt wurde. Jede Hilfe wäre sehr dankbar.

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

... wird versucht, die Anzahl der Zeichen in der zurückgegebenen Zeichenfolge zu zählen, aber wenn die Kopfzeile nicht vorhanden ist, wird NULL zurückgegeben, daher wird eine Ausnahme ausgelöst. Ihr zweites Beispiel macht effektiv dasselbe: Es durchsucht die Sammlung von Headern und gibt NULL zurück, wenn es nicht existiert. Anschließend versuchen Sie, die Anzahl der Zeichen zu zählen:

Verwenden Sie dies stattdessen:

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

Oder wenn Sie leere oder leere Zeichenfolgen als nicht gesetzt behandeln möchten, verwenden Sie:

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

Der Null-Coalesce-Operator? Gibt eine leere Zeichenfolge zurück, wenn der Header null ist, und beendet das Auslösen einer NullReferenceException.

Eine Variation Ihres zweiten Versuchs wird auch funktionieren:

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

Edit: Entschuldigung, du hast nicht explizit nach dem Wert gesucht true :

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

Gibt false zurück, wenn der Header-Wert false ist oder wenn Header nicht festgelegt wurde oder wenn Header einen anderen Wert als true oder false hat. Gibt true zurück, wenn der Header-Wert die Zeichenfolge 'true' ist.

41
Sunday Ironfoot

Header existiert:

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

oder noch besser:

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

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

dadurch wird überprüft, ob es auf true gesetzt ist. Dies sollte idiotensicher sein, da es sich nicht um führende/nachfolgende Leerzeichen handelt und die Groß-/Kleinschreibung nicht berücksichtigt wird (bool.TryParse funktioniert mit null)

Addon: Mit dieser Erweiterungsmethode, die einen nullbaren Booleschen Wert zurückgibt, können Sie dies einfacher machen. Es sollte sowohl bei ungültigen Eingaben als auch bei Null funktionieren.

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

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

Verwendung (da dies eine Erweiterungsmethode und keine Instanzmethode ist, wird keine Ausnahme für null ausgelöst - dies kann jedoch verwirrend sein):

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

Erstens tun Sie dies aus Ihrer Sicht nicht. Sie tun dies im Controller und geben ein Ansichtsmodell an die Ansicht zurück, sodass sich die Ansicht nicht um benutzerdefinierte HTTP-Header kümmern muss, sondern nur um die Anzeige von Daten im Ansichtsmodell:

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

oder

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

Mit dem folgenden Code können Sie überprüfen, ob der gewünschte Header in Request.Headers vorhanden ist:

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