【问题标题】:Cannot retrieve cookie value无法检索 cookie 值
【发布时间】:2025-12-13 03:15:02
【问题描述】:

我正在使用编码存储和检索 cookie

public static void SetCookie(string key, string value, int dayExpires)
    {
        HttpCookie encodedCookie = HttpSecureCookie.Encode(new HttpCookie(key, value));
        encodedCookie.Expires = DateTime.Now.AddDays(dayExpires);

        HttpContext.Current.Response.Cookies.Remove(key);
        HttpContext.Current.Response.Cookies.Add(encodedCookie);
    }
    public static string GetCookie(string key)
    {
        string value = string.Empty;
        HttpCookie cookie = HttpContext.Current.Request.Cookies[key];

        if (cookie != null)
        {
            // For security purpose, we need to encrypt the value.
            HttpCookie decodedCookie = HttpSecureCookie.Decode(cookie);
            value = decodedCookie.Value;
        }
        else
        {
            SetCookie("currency", "GBP", 1);
            if (key.ToUpper() == "CURRENCY")
                value = "GBP";
            else if (key.ToUpper() == "COUNTRYCODE")
                value = "GB";
        }
        return value;
    }

}

我能够存储 cookie,并且当我尝试使用 HttpContext.Current.Request.Cookies[key] 从 cookie 中获取货币值时,其中键具有货币的值正在获取为“”

在下图中,您可以查看存储的 cookie

在这里你可以看到你可以重复两次货币。在键 [4] 中,货币是“”,因为我在键 [6] 中有我的 cookie 值。当我删除密钥然后在直接行中添加密钥时,为什么货币重复两次的任何帮助。

出于测试目的,我已经放置了集合并进入了直接行。代码如下

CookieStore.SetCookie("currency", CurrencyCode, 1);
string currencycookie=CookieStore.GetCookie("currency");

最终,我必须只有一种货币,在那里我拥有唯一的密钥。

谢谢。

【问题讨论】:

    标签: c# asp.net-mvc-4 cookies


    【解决方案1】:

    这样删除密钥对您没有帮助,请删除客户端浏览器中设置的cookie。您必须为现有密钥设置过去的到期日期。更好的解决方案是检查密钥是否可用更新 cookie 的值,而不是删除和添加它。

          if (Request.Cookies[key] != null)
            {
                Response.Cookies[key].Value = "NEW VAalue"                
            }
            else
             // create the new cookie key.
    

    查看我更新后的代码,其中包含删除和添加新值的逻辑

          if (Request.Cookies["Test"] == null)
            {
                HttpCookie testCookie = new HttpCookie("Test");
                testCookie.Value = "1";
                testCookie.Expires = DateTime.Now.AddDays(1);
                Response.Cookies.Add(testCookie);
            }
            else
            {
                var c = Request.Cookies["Test"];
                c.Expires = DateTime.Now.AddDays(-10);
                Response.Cookies.Add(c);
                HttpCookie testCookie = new HttpCookie("Test");
                testCookie.Value = "2";
                testCookie.Expires = DateTime.Now.AddDays(1);
                Response.Cookies.Add(testCookie);
            }
    

    我已经更新了你的方法。

          public static void SetCookie(string key, string value, int dayExpires)
        {
            if (Request.Cookies[key] != null)
            {
                var c = HttpContext.Current.Request.Cookies[key];
                c.Expires = DateTime.Now.AddDays(-10);
                HttpContext.Current.Response.Cookies.Add(c);
            }
            HttpCookie encodedCookie = HttpSecureCookie.Encode(new HttpCookie(key, value));
            encodedCookie.Expires = DateTime.Now.AddDays(dayExpires);
            HttpContext.Current.Response.Cookies.Add(encodedCookie);
        }
    

    【讨论】:

    • 好的,谢谢兄弟。但是有没有删除不需要的cookie的方法?
    • @Saurabh 您必须将到期日期设置为过去才能删除不需要的密钥,然后添加新的
    • 在第一个货币密钥中没有添加任何东西,而是在 {1/1/0001 12:00:00 AM} 中到期,第二个密钥正在获取我的存储值。我无法将到期设置为第一个。 @Devesh
    • @Saurabh 我已经用一个在我的系统中运行良好的测试代码更新了我的答案。它正在删除旧密钥并添加具有新值的新密钥。试试吧
    • @Saurabh 在您将现有密钥的过期时间设置为过去后,将其再次添加到响应中,然后使用该值创建新的,并将新的也添加到响应中。仔细查看我的代码。查看我更新的回复。我修改了你的方法