获得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"]); }