【问题标题】:Cookie not updatingCookie 未更新
【发布时间】:2020-09-17 21:05:01
【问题描述】:

我正在尝试更新 cookie 值,但它不起作用 - 我尝试过的所有操作都没有更新 cookie,我总是得到 cookie 的初始值。

所以我已经搜索过,根据 MSDN,我应该能够通过执行以下操作来更新 cookie:

HttpCookie cookie = new HttpCookie("cookiename");
cookie.Value = cookieValue;
cookie.Expires = DateTime.Now.AddDays(30);
HttpContext.Current.Response.Cookies.Set(cookie); // also just tried using .Add again here

由于这不起作用,我又进行了一次搜索,SO 上的人说我应该能够做到这一点:

HttpContext.Current.Response.Cookies["cookiename"].Value = cookieValue;
HttpContext.Current.Response.Cookies["cookiename"].Expires = DateTime.Now.AddDays(30);

但这也不起作用,所以我尝试删除 cookie 并重新添加它:

HttpCookie cookie = new HttpCookie("cookiename");
cookie.Value = cookieValue;
cookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.Cookies.Add(cookie);

cookie.Expires = DateTime.Now.AddDays(30);
HttpContext.Current.Response.Cookies.Add(cookie);

我也尝试在重新添加之前使用以下内容删除 cookie

ResponseCookies.Remove("cookiename");

而且这也不起作用,所以我现在不确定还能尝试什么。有谁知道如何用 c# 更新 cookie?

更新

如果我在更新代码后单步执行代码并检查HttpContext.Current.Request.Cookies["cookiename"].Value,它会显示新值。如果我然后回收应用程序池,以便必须再次从文件中读取 cookie,它会显示原始值,所以上面的代码似乎没有更新物理 cookie

【问题讨论】:

  • 尝试删除 cookie,然后重新添加新值。看看这是否有效。是ajax请求吗?
  • @MihirSolanki,不是 ajax 请求 - 否则我会使用 $.cookie 效果更好 - 它实际上会更新 cookie!
  • 您无法直接更新物理 cookie,因为 cookie 在用户的计算机上。丢弃 cookie 是浏览器的责任。

标签: c# cookies


【解决方案1】:

你不能!

根据MSDN,您已将当前cookie 替换为同名的新cookie。关于这件事有一整节。

修改和删除 Cookies

您不能直接修改 cookie。相反,更改 cookie 包括创建一个新 cookie 使用新值,然后将 cookie 发送到浏览器以 在客户端覆盖旧版本。


更新

在cmets中写了之后,发现问题在这里。

根据specs,您也不能在 cookie 值中使用分号。

这个字符串是一个字符序列不包括分号、逗号 和空白。如果需要将此类数据放在名称中或 值,一些编码方式如 URL 样式 %XX 编码是 推荐,虽然没有定义或要求编码。

【讨论】:

  • 我已经阅读了整个部分并尝试了它在该部分中所说的内容(正如我在我的问题中的尝试所看到的那样)
  • @Pete 您是否尝试过更改新 cookie 的过期日期?
  • @Pete 您在哪个浏览器中进行测试?
  • @Pete 或者你的cookieValue 包含;?
  • 终于! :D 和这个小家伙有太多的斗争。
【解决方案2】:

我面临着类似的问题。如果解决此问题,请使用以下方法设置和获取 cookie。

 public static void SetCookie(string key, string value, TimeSpan expires, bool http = false)
        {
        
            if (HttpContext.Current.Request.Cookies[key] != null)
            {
                
                var cookieOld = new HttpCookie(key);
                cookieOld.Expires = DateTime.Now.Add(expires);
                cookieOld.Value = value;
                HttpContext.Current.Response.Cookies.Add(cookieOld);
            }
            else
            {
                HttpCookie encodedCookie = new HttpCookie(key, value);
                encodedCookie.Expires = DateTime.Now.Add(expires);
                HttpContext.Current.Response.Cookies.Add(encodedCookie);
            }
        }

以及下面用于GetCookie的代码

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

            if (cookie != null)
            {
                value = cookie.Value;
            }
            return value;
        }

以下方式调用get和set函数

public static string CustomerName
        {
            get { return CookieStore.GetCookie("customername"); }
            set { CookieStore.SetCookie("customername", value.ToString(), TimeSpan.FromHours(24), true); }
        }

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多