c# - Obteniendo un valor de Request.Headers
asp.net-mvc httpwebrequest (6)
Muy simple, estoy seguro, ¡pero llevándome por la pared! Hay un componente que uso en mi aplicación web que se identifica a sí mismo durante una solicitud web al agregar el encabezado "XYZComponent = true". El problema que tengo es, ¿cómo verifica esto en su vista?
Lo siguiente no funcionará:
if (Request.Headers["XYZComponent"].Count() > 0)
Ni esto
if (Request.Headers.AllKeys.Where(k => k == "XYZComponent").Count() > 0)
Ambos lanzan excepciones si la variable de encabezado no se ha establecido. Cualquier ayuda sería muy apreciada.
El encabezado existe:
if (Request.Headers["XYZComponent"] != null)
o mejor:
string xyzHeader = Request.Headers["XYZComponent"];
bool isXYZ;
if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ)
que verificará si se establece en true. Esto debería ser infalible porque no le importa los espacios en blanco bool.TryParse
o bool.TryParse
no distingue entre mayúsculas y minúsculas ( bool.TryParse
funciona en null
)
Complemento: Podría hacer esto más simple con este método de extensión que devuelve un booleano anulable. Debería funcionar tanto en entrada inválida como en nula.
public static bool? ToBoolean(this string s)
{
bool result;
if (bool.TryParse(s, out result))
return result;
else
return null;
}
Uso (debido a que este es un método de extensión y no un método de instancia, no arrojará una excepción en null
, aunque puede ser confuso):
if (Request.Headers["XYZComponent"].ToBoolean() == true)
El siguiente código debería permitirte verificar la existencia del encabezado que estás 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"]);
}
En primer lugar no haces esto desde tu punto de vista. Lo hace en el controlador y devuelve un modelo de vista a la vista para que la vista no tenga que preocuparse por los encabezados HTTP personalizados, sino simplemente mostrar los datos en el modelo de vista:
public ActionResult Index()
{
var xyzComponent = Request.Headers["xyzComponent"];
var model = new MyModel
{
IsCustomHeaderSet = (xyzComponent != null)
}
return View(model);
}
if ((Request.Headers["XYZComponent"] ?? "") == "true")
{
// header is present and set to "true"
}
if (Request.Headers["XYZComponent"].Count() > 0)
... intentará contar el número de caracteres en la cadena devuelta, pero si el encabezado no existe, devolverá NULL, por lo tanto, está lanzando una excepción. Su segundo ejemplo efectivamente hace lo mismo, buscará a través de la colección de encabezados y devolverá NULL si no existe, con lo que luego intentará contar el número de caracteres en:
Use esto en su lugar:
if(Request.Headers["XYZComponent"] != null)
O si desea tratar cadenas en blanco o vacías como no configuradas, use:
if((Request.Headers["XYZComponent"] ?? "").Trim().Length > 0)
El operador Null Coalesce ?? devolverá una cadena en blanco si el encabezado es nulo, deteniéndolo lanzando una NullReferenceException.
Una variación de tu segundo intento también funcionará:
if (Request.Headers.AllKeys.Any(k => string.Equals(k, "XYZComponent")))
Edición: Lo sentimos, no se dio cuenta de que estaba comprobando explícitamente el valor verdadero :
bool isSet = Boolean.TryParse(Request.Headers["XYZComponent"], out isSet) && isSet;
Devolverá falso si el valor del encabezado es falso, o si el encabezado no se ha establecido o si el encabezado es cualquier otro valor que no sea verdadero o falso. Devolverá true si el valor del encabezado es la cadena ''true''
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