如何确定HTTP请求头值是否存在

57

非常简单,但困扰了我很久!我的Web应用程序中使用了一个组件,在Web请求期间通过添加头文件“XYZComponent=true”来标识自己。我遇到的问题是,如何在视图中检查它?

以下方法不起作用:

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

也不是这样:

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

如果头部变量未设置,两者都会抛出异常。非常感谢任何帮助。


我不知道MVC是否包装了这个功能,但在HTTP本身中,头部的格式为“XYZComponent:true”。我只是想知道你是否已经成功设置了一个类似“XYZComponent=true:”这样的头部(即你引用的整个字符串是名称,因此需要检查)。应该很容易检查,因为你已经知道如何遍历键... - Chris
7个回答

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

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

请改用以下内容替换:

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

或者如果你想把空白或空字符串视为未设置的话,可以使用:

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

如果header为null,Null Coalesce运算符??将返回一个空字符串,防止抛出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。如果Header的值是字符串'true',则返回true。


13

存在头部信息:

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

或者更好的是:

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

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

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

附加功能:您可以使用此扩展方法使其更简单,该方法返回可空布尔值。 它应该适用于无效输入和null。

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

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

使用方法(因为这是扩展方法而不是实例方法,所以对于null它不会抛出异常 - 尽管这可能有些令人困惑):

使用方法(因为这是扩展方法而不是实例方法,所以对于null它不会抛出异常 - 尽管这可能有些令人困惑):

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

5

首先,你不应该在视图中这样做。你应该在控制器中完成,并返回一个视图模型给视图。这样视图就不需要关心自定义HTTP头信息,只需要展示视图模型中的数据:

public ActionResult Index()
{
    var xyzComponent = Request.Headers["xyzComponent"];
    var model = new MyModel 
    {
        IsCustomHeaderSet = (xyzComponent != null)
    }
    return View(model);
}

4
在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.

3
以下代码应该允许您检查Request.Headers中所需标头的存在性:
if (Request.Headers.AllKeys.Contains("XYZComponent"))
{
    // Can now check if the value is true:
    var value = Convert.ToBoolean(Request.Headers["XYZComponent"]);
}

2
if ((Request.Headers["XYZComponent"] ?? "") == "true")
{
    // header is present and set to "true"
}

这是一个不区分大小写的比较,因为它可以是XYZComponent: True或XYZComponent: TRUE。请尝试使用(Request.Headers["XYZComponent"] ?? "").Equals("true", StringComparison.InvariantCultureIgnoreCase)。 - Sunday Ironfoot
2
@Sunday:由于HTTP协议始终使用英语,因此您应该使用StringComparison.OrdinalIgnoreCase,这是原始的逐字节比较。在http://lists.ximian.com/pipermail/mono-list/2010-July/045508.html线程中了解更多信息。 - abatishchev

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接