获得Request.Headers值

Jim*_*mbo 29 c# asp.net-mvc httpwebrequest namevaluecollection http-headers

非常简单我敢肯定,但是让我爬上墙!我在我的Web应用程序中使用了一个组件,通过添加标题"XYZComponent = true"在Web请求中标识自己 - 我遇到的问题是,您如何在视图中检查此问题?

以下不会起作用:

if (Request.Headers["XYZComponent"].Count() > 0)
Run Code Online (Sandbox Code Playgroud)

这不是:

if (Request.Headers.AllKeys.Where(k => k == "XYZComponent").Count() > 0)
Run Code Online (Sandbox Code Playgroud)

如果尚未设置标头变量,则两者都抛出异常.非常感激任何的帮助.

Sun*_*oot 42

if (Request.Headers["XYZComponent"].Count() > 0)
Run Code Online (Sandbox Code Playgroud)

...将尝试计算返回字符串中的字符数,但如果标头不存在则返回NULL,因此它会抛出异常.你的第二个例子有效地做了同样的事情,它将搜索Headers的集合并返回NULL(如果它不存在),然后你尝试计算字符数:

请改用:

if(Request.Headers["XYZComponent"] != null)
Run Code Online (Sandbox Code Playgroud)

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

if((Request.Headers["XYZComponent"] ?? "").Trim().Length > 0)
Run Code Online (Sandbox Code Playgroud)

Null Coalesce运算符?? 如果标头为null,将返回一个空字符串,停止抛出NullReferenceException.

您的第二次尝试的变体也将起作用:

if (Request.Headers.AllKeys.Any(k => string.Equals(k, "XYZComponent")))
Run Code Online (Sandbox Code Playgroud)

编辑:抱歉没有意识到你明确检查值为true:

bool isSet = Boolean.TryParse(Request.Headers["XYZComponent"], out isSet) && isSet;
Run Code Online (Sandbox Code Playgroud)

如果Header值为false,或者如果未设置Header或Header是除true或false之外的任何其他值,则返回false.将返回true是Header值是字符串'true'


Las*_*olt 9

标题存在:

if (Request.Headers["XYZComponent"] != null)
Run Code Online (Sandbox Code Playgroud)

甚至更好:

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

if (bool.TryParse(xyzHeader, out isXYZ) && isXYZ)
Run Code Online (Sandbox Code Playgroud)

这将检查它是否设置为true.这应该是万无一失的,因为它不关心前导/尾随空格并且不区分大小写(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;
}
Run Code Online (Sandbox Code Playgroud)

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

if (Request.Headers["XYZComponent"].ToBoolean() == true)
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 5

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

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