【问题标题】:How to get a null value if the header doesn't exist如果标头不存在,如何获取空值
【发布时间】:2014-04-14 18:47:02
【问题描述】:

我正在使用请求上下文来获取名为“token”的标头的值。

 var token = context.request.Headers.GetValues("Token")

现在如果标题存在。这一切都有效,但现在如果标题不存在,我希望它返回 null。但它会抛出异常 System.InvalidOperationExecption

我唯一的选择是在它周围抛出一个 try catch 吗?

【问题讨论】:

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


    【解决方案1】:

    你可以这样做

    if (Context.Request.Headers["Token"] != null)
    {
          var token = Context.Request.Headers.GetValues("Token");         
          return token;
    }
    else 
          return null;
    

    【讨论】:

    • 如果Context.Request.Headers["Token"] 为空并且我在我看来使用了@token,那不会抛出未定义的错误吗?您的else 是否应该设置为token = null
    • 既然可以原样返回,为什么还要将它设置为 null?
    • 我只是在问。在问题中提到"But now if the header doesn't exist, I want it to return null. But instead it throws an exception System.InvalidOperationExecption"...这还会发生吗?
    • 像我提到的那样使用它。
    【解决方案2】:

    我遇到了同样的问题,当标题不存在时,它会向我抛出错误。然而,我设法找到了一种使用 .NET Core 3.1 的简​​单方法,并且可以在 1 行中完成,并且可以避免您遇到任何这些错误。

    但简而言之,它会检查标头是否包含键“Token”,如果是则返回值,否则返回 null。

    string token = HttpContext.Request.Headers.ContainsKey("Token") ? HttpContext.Request.Headers["Token"][0] : null;
    

    【讨论】:

      【解决方案3】:

      Headers 类提供了一个Contains() 方法。

      示例 1:

      if (!request.Headers.Contains("Token"))
          {
              return null;
          }
      

      示例 2:

      string token = request.Headers.Contains("Token") ? request.Headers.GetValues("Token").First() : null;
      

      【讨论】:

        【解决方案4】:

        以下是如何检查标头是否存在以及值是否为空的示例。

        这些示例使用 DotNet Core 3.1

        检查是否存在——不关心值:

        
        if (context.HttpContext.Request.Headers.Any(h => h.Key.Equals("X-SOME-HEADER", StringComparison.InvariantCultureIgnoreCase))) {
            // Success
            _logger.LogInformation('Header found');
        } else {
            // Failure
            _logger.LogWarning('Header not found');
        }
        
        

        检查是否存在并输出值:

        if (context.HttpContext.Request.Headers.TryGetValue("X-SOME-HEADER", out var token)) {
            // Found header
            _logger.LogInformation($"Header found. Null:[{!token.Any()}]")
        } else {
            // Failure
            _logger.LogWarning('Header not found');
        }
        
        

        【讨论】:

          【解决方案5】:

          试试这个:

           var token = string.IsNullOrEmpty(context.request.Headers.GetValues("Token")) ? null :
                                         context.request.Headers.GetValues("Token");
          

          【讨论】:

            【解决方案6】:

            您可以使用 Try Catch 逻辑:

            try
            {
                var token = context.request.Headers.GetValues("Token");
            }
            
            catch
            {
                var token = null;
            }
            

            【讨论】:

            • 抛出异常是一项代价高昂的操作。只有在异常情况下才应捕获异常。不在您的常规代码中。你应该尽可能地避免它。不是一个好的解决方案。
            【解决方案7】:
            if (Context.Request.Headers.ContainsKey("Token"))
            {
                  var token = Context.Request.Headers["Token"].Value;         
                  return token;
            }
            else 
                  return null;
            

            【讨论】:

            • 加1-2句解释怎么样?
            • @Falco,没什么好解释的。这就是在 .net 核心中的完成方式。现在这里提到的其他解决方案将导致异常/编译错误
            猜你喜欢
            • 2023-03-03
            • 2015-11-13
            • 2016-10-31
            • 2016-07-25
            • 1970-01-01
            • 1970-01-01
            • 2011-06-26
            • 2019-05-16
            • 1970-01-01
            相关资源
            最近更新 更多