获得Request.Headers值
非常简单我敢肯定,但是把我拉到墙上! 我在我的Web应用程序中使用了一个组件,通过添加标题“XYZComponent = true”在Web请求中标识自己 – 我遇到的问题是,您如何在视图中检查此问题?
以下不会工作:
if (Request.Headers["XYZComponent"].Count() > 0)
这不是:
if (Request.Headers.AllKeys.Where(k => k == "XYZComponent").Count() > 0)
如果尚未设置标头变量,则两者都抛出exception。 非常感激任何的帮助。
if (Request.Headers["XYZComponent"].Count() > 0)
…将尝试计算返回字符串中的字符数,但如果标头不存在则会返回NULL,因此它会抛出exception。 你的第二个例子有效地做同样的事情,它将搜索Headers的集合并返回NULL(如果它不存在),然后你尝试计算字符数:
改为使用它:
if(Request.Headers["XYZComponent"] != null)
或者,如果要将空字符串或空字符串视为未设置,请使用:
if((Request.Headers["XYZComponent"] ?? "").Trim().Length > 0)
Null Coalesce运算符?? 如果标头为null,将返回一个空字符串,停止它抛出NullReferenceException。
您的第二次尝试的变体也将起作用:
if (Request.Headers.AllKeys.Any(k => string.Equals(k, "XYZComponent")))
编辑:抱歉没有意识到您明确检查值true :
bool isSet = Boolean.TryParse(Request.Headers["XYZComponent"], out isSet) && isSet;
如果Header值为false,或者如果未设置Header或Header是除true或false之外的任何其他值,则返回false。 将返回true是Header值是字符串’true’
标题存在:
if (Request.Headers["XYZComponent"] != null)
甚至更好:
string xyzHeader = Request.Headers["XYZComponent"]; bool isXYZ; if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ)
这将检查它是否设置为true。 这应该是bool.TryParse
,因为它不关心前导/尾随空格并且不区分大小写( bool.TryParse
确实对null
起作用)
Addon:你可以通过这个返回可以为空的布尔值的扩展方法使这更简单。 它应该对无效输入和null都有效。
public static bool? ToBoolean(this string s) { bool result; if (bool.TryParse(s, out result)) return result; else return null; }
用法(因为这是一个扩展方法,而不是实例方法,这不会在null
上抛出exception – 但它可能会令人困惑):
if (Request.Headers["XYZComponent"].ToBoolean() == true)
首先,您不要在视图中执行此操作。 您可以在控制器中执行此操作并将视图模型返回到视图,以便视图不需要关心自定义HTTP标头,而只需在视图模型上显示数据:
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" }
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
要么
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
以下代码应该允许您在Request.Headers
检查您之后是否存在标题:
if (Request.Headers.AllKeys.Contains("XYZComponent")) { // Can now check if the value is true: var value = Convert.ToBoolean(Request.Headers["XYZComponent"]); }