【问题标题】:Getting a Request.Headers value获取 Request.Headers 值
【发布时间】:2011-04-01 14:20:17
【问题描述】:

我敢肯定,这很简单,但把我逼疯了!我在 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:”这样的标题(即你引用的整个字符串是名称,因此你需要检查什么。应该很容易检查,因为你已经知道如何遍历键...

标签: c# asp.net-mvc httpwebrequest http-headers namevaluecollection


【解决方案1】:
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'

【讨论】:

    【解决方案2】:

    标头存在:

    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 上引发异常 - 不过可能会令人困惑):

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        if (Request.Headers.AllKeys.Contains("XYZComponent"))
        {
            // Can now check if the value is true:
            var value = Convert.ToBoolean(Request.Headers["XYZComponent"]);
        }
        

        【讨论】:

          【解决方案5】:
          if ((Request.Headers["XYZComponent"] ?? "") == "true")
          {
              // header is present and set to "true"
          }
          

          【讨论】:

          • 这是一个不区分大小写的比较,因为它可能是 XYZComponent: True 或 XYZComponent: TRUE。试试 (Request.Headers["XYZComponent"] ?? "").Equals("true", StringComparison.InvariantCultureIgnoreCase)
          • @Sunday:就 HTTP 协议始终使用英文而言,您应该使用StringComparison.OrdinalIgnoreCase,它是原始的,逐字节比较。在lists.ximian.com/pipermail/mono-list/2010-July/045508.html的线程中查看更多信息
          【解决方案6】:
          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
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2014-09-28
              • 1970-01-01
              • 2016-05-20
              • 2013-02-20
              • 2022-12-22
              • 1970-01-01
              • 2018-03-16
              • 2012-07-21
              • 1970-01-01
              相关资源
              最近更新 更多