26

Sehr einfach bin ich sicher, aber treibt mich die Wand hoch! Es gibt eine Komponente, die ich in meiner Webanwendung verwende, die sich während einer Webanfrage identifiziert, indem sie die Kopfzeile "XYZComponent = true" hinzufügt - das Problem, das ich habe, ist, wie überprüfen Sie das aus Ihrer Sicht?Anfrage bekommen.Kopfzeilen Wert

Die folgende nicht funktionieren:

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

Auch dies:

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

Beide werfen Ausnahmen, wenn der Header-Variable nicht gesetzt wurde. Jede Hilfe würde sehr geschätzt werden.

+0

Ich weiß nicht, ob MVC umschließt die Funktionalität, aber in HTTP selbst haben Header die Form "XYZComponent: true". Ich wüsste nur, wenn Sie es geschafft haben, einen Header wie "XYZComponent = true:" zu setzen (dh die ganze Zeichenfolge, die Sie angegeben haben, ist der Name und somit das, wonach Sie suchen sollten. Sollte leicht zu überprüfen sein, da Sie bereits wissen wie um durch die Schlüssel zu iterieren ... – Chris

Antwort

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

... wird versucht, die Anzahl der Zeichen in der zurückgegebenen Zeichenfolge zu zählen, aber wenn der Header nicht existiert es NULL zurück, Daher wirft es eine Ausnahme auf. Ihr zweites Beispiel effektiv macht das gleiche, es wird durch die Sammlung von Headern suchen und NULL zurück, wenn es nicht vorhanden ist, die Sie dann auf die Anzahl der Zeichen zu zählen versuchen:

Verwenden Sie stattdessen:

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

oder wenn Sie leere oder leere Zeichenfolgen behandeln wollen als nicht gesetzt, dann verwenden:

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

Die Null Coalesce Operator ?? Gibt eine leere Zeichenfolge zurück, wenn die Kopfzeile den Wert null hat, wodurch die Ausgabe einer NullReferenceException beendet wird.

wird eine Variation des zweiten Versuch auch arbeiten:

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

Edit: Es Sie explizit für den Wert Überprüfung wahr war nicht klar waren:

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 richtig oder falsch. Will return true ist der Header-Wert die Zeichenfolge ‚true‘ ist

8

-Header vorhanden ist:

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

oder noch besser:

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

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

das anzeigt, ob prüft es auf true gesetzt ist. Dies sollte narrensicher sein, weil es nicht auf führende/nachfolgende Leerzeichen schert und Groß- und Kleinschreibung (bool.TryParse funktioniert auf null)

Addon: könnten Sie machen dies einfacher mit dieser Erweiterung Methode, die eine nullable zurückgibt boolesch. Es sollte sowohl mit ungültiger Eingabe als auch mit Null funktionieren.

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

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

Usage (weil dies eine Erweiterung Methode und nicht die Instanz-Methode wird dies nicht eine Ausnahme auf null werfen - es verwirrend sein kann, obwohl):

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

Erstens Sie dies nicht tun Ihrer Meinung nach. Sie tun es in der Steuerung und gibt eine Ansicht Modell der Ansicht, so dass die Ansicht muss nicht über benutzerdefinierte HTTP-Header kümmern, sondern nur die Anzeige von Daten auf dem View-Modell:

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

Es ist ein Vergleich zwischen Groß- und Kleinschreibung, da es XYZComponent: True oder XYZComponent: TRUE sein könnte. Try (Request.Headers ["XYZComponent"] ?? "") .Equals ("true", StringComparison .InvariantCultureIgnoreCase) –

+2

@Sunday: Soweit das HTTP-Protokoll immer Englisch verwendet, sollten Sie 'StringComparison.OrdinalIgnoreCase' verwenden, das ist raw, Byte für Byte, Vergleich. Weitere Informationen finden Sie im Thread in http://lists.ximian.com/pipermail/ Mono-Liste/2010-Juli/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 

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

Der folgende Code erlauben sollten Sie für die Existenz des Headers, nachdem Sie sind zu überprüfen, in Request.Headers:

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