26

Muy simple, estoy seguro, ¡pero me lleva por la pared! Hay un componente que utilizo en mi aplicación web que se identifica durante una solicitud web al agregar el encabezado "XYZComponent = true" - el problema que tengo es, ¿cómo lo verificas en tu vista?Obteniendo un valor de Request.Headers

La siguiente no funcionará:

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

Tampoco esto:

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

Ambas excepciones tiro si la variable de cabecera no se ha establecido. Cualquier ayuda sería muy apreciada. existe

+0

No sé si MVC envuelve la funcionalidad, pero en HTTP los encabezados tienen la forma "XYZComponent: true". Estoy pensando si has logrado establecer un encabezado como "XYZComponent = true:" (es decir, toda la cadena que citaste es el nombre y, por lo tanto, lo que debes verificar. Debería ser fácil de verificar ya que ya sabes cómo para iterar a través de las teclas ... – Chris

Respuesta

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

... será tratado de contar el número de caracteres en la cadena devuelta, pero si la cabecera no existe devolverá NULL, de ahí por qué está lanzando una excepción. Su segundo ejemplo efectivamente hace lo mismo, se buscará a través de la colección de encabezados y devolver NULL si no existe, lo que a continuación, intenta contar el número de caracteres en:

Use este lugar:

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

o si usted quiere tratar cadenas vacías o en blanco no establecidos a continuación, utilizar:

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

El operador nulo Coalesce ?? devolverá una cadena en blanco si el encabezado es nulo, deteniéndolo arrojando una NullReferenceException.

una variación de su segundo intento también trabajará:

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

Editar: este momento no se dio cuenta que estaba mirando de forma explícita por el valor verdadero :

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

Devolverá falso si el valor de Encabezado es falso, o si el Encabezado no se ha configurado o si el Encabezado tiene otro valor que no sea verdadero o falso. Devolverá verdadero es el valor de encabezado es la cadena 'verdadera'

8

Cabecera:

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

o incluso mejor:

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

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

que comprobará si se establece en true. Esto debe ser a prueba de tontos, ya que no se preocupa en los más importantes/espacios en blanco finales y distingue entre mayúsculas y minúsculas (bool.TryParse funciona en null)

Addon: Se podría hacer esto más sencillo con este método de extensión que devuelve un anulable booleano Debería funcionar tanto en entrada inválida como nula.

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

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

uso (porque se trata de un método de extensión y el método de instancia no esto no será una excepción en null - puede ser confuso, sin embargo):

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

En primer lugar usted no lo hace en tu opinión. Lo hace en el controlador y devuelven un modelo de vista a la vista para que la vista no necesita preocuparse por las cabeceras HTTP personalizadas, pero los datos que muestran solo en el modelo de vista:

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 una comparación insensible a mayúsculas y minúsculas, ya que podría ser XYZComponent: True o XYZComponent: TRUE. Pruebe (Request.Headers ["XYZComponent"] ?? "") .Equals ("true", StringComparison .InvariantCultureIgnoreCase) –

+2

@Sunday: en cuanto al protocolo HTTP siempre usa el inglés, debe usar 'StringComparison.OrdinalIgnoreCase' que es en bruto, byte a byte, comparación. Ver más en el hilo en http://lists.ximian.com/pipermail/ mono-list/2010-July/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 

o

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

El siguiente código debe permitir que compruebe la existencia de la cabecera que está buscando en Request.Headers:

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