48

我敢肯定,这很简单,但把我逼到了墙角!我在我的 Web 应用程序中使用了一个组件,它在 Web 请求期间通过添加标题“XYZComponent=true”来标识自己 - 我遇到的问题是,你如何在你的视图中检查这个?

以下将不起作用:

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

也不是这个:

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

如果尚未设置标头变量,则两者都会引发异常。非常感激任何的帮助。

4

7 回答 7

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

... 将尝试计算返回字符串中的字符数,但如果标头不存在,它将返回 NULL,因此它会引发异常。您的第二个示例有效地执行了相同的操作,它将搜索 Headers 的集合,如果它不存在则返回 NULL,然后您尝试计算其上的字符数:

改用这个:

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

或者,如果您想将空白或空字符串视为未设置,请使用:

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

空合并运算符 ?? 如果标头为空,将返回一个空白字符串,停止它抛出 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'

于 2010-08-20T10:46:54.807 回答
13

标头存在:

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

甚至更好:

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

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

这将检查它是否设置为true。这应该是万无一失的,因为它不关心前导/尾随空格并且不区分大小写(bool.TryParse确实适用null

插件:您可以使用返回可空布尔值的扩展方法使这更简单。它应该适用于无效输入和空值。

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

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

用法(因为这是一个扩展方法而不是实例方法,所以它不会引发异常null- 但它可能会令人困惑):

if (Request.Headers["XYZComponent"].ToBoolean() == true)
于 2010-08-20T10:34:05.413 回答
5

首先,在您看来,您不会这样做。您在控制器中执行此操作并将视图模型返回给视图,以便视图不需要关心自定义 HTTP 标头,而只需在视图模型上显示数据:

public ActionResult Index()
{
    var xyzComponent = Request.Headers["xyzComponent"];
    var model = new MyModel 
    {
        IsCustomHeaderSet = (xyzComponent != null)
    }
    return View(model);
}
于 2010-08-20T10:36:31.607 回答
3

以下代码应允许您检查您所追求的标头是否存在Request.Headers

if (Request.Headers.AllKeys.Contains("XYZComponent"))
{
    // Can now check if the value is true:
    var value = Convert.ToBoolean(Request.Headers["XYZComponent"]);
}
于 2010-08-20T23:29:49.873 回答
2
if ((Request.Headers["XYZComponent"] ?? "") == "true")
{
    // header is present and set to "true"
}
于 2010-08-20T10:37:16.047 回答
2
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
于 2010-08-20T10:41:45.467 回答
2

在 dotnet core 中,Request.Headers["X-MyCustomHeader"]返回StringValues不为空的值。您可以检查计数以确保它找到您的标题,如下所示:

var myHeaderValue = Request.Headers["X-MyCustomHeader"];
if(myHeaderValue.Count == 0) return Unauthorized();
string myHeader = myHeaderValue.ToString(); //For illustration purposes.
于 2020-01-30T14:01:14.353 回答