【问题标题】:Unable to update cookies in asp.net mvc无法在 asp.net mvc 中更新 cookie
【发布时间】:2014-10-31 08:33:39
【问题描述】:

我可以写入和读取 cookie,但我无法更改现有 cookie 的值,它始终具有第一个设置值。我发现了几种实现方法,但没有一种方法有效。这是我的代码:

private void AddPost(string key)
    {
        var context = System.Web.HttpContext.Current;
        var request = context.Request;
        var response = context.Response;

        var cookie = request.Cookies[Constants.PostsViewing];

        if (cookie == null || string.IsNullOrEmpty(cookie.Value))
        {
            response.Cookies.Add(new HttpCookie(Constants.PostsViewing, key)
            {
                Expires = DateTime.Now.AddDays(365)
            });
        }
        else
        {
            if (cookie.Value.Split(';').Contains(key))
            {
                return;
            }

            var v = cookie.Value + ";" + key;

            cookie.Value = v;
            cookie.Expires = DateTime.Now.AddDays(365);
            response.Cookies.Add(cookie);

            // this way also doesn't work
            //cookie.Value = v;
            //response.AppendCookie(cookie);

            // and this
            //response.Cookies[Constants.PostsViewing].Value = v;
            //response.Cookies[Constants.PostsViewing].Expires = DateTime.Now.AddDays(365);
        }

    }

根据msdn cookie 文件应该被改写。

每个 cookie 必须有一个唯一的名称,以便以后从浏览器读取它时可以识别它。由于 cookie 是按名称存储的,因此将两个 cookie 命名为相同会导致其中一个被覆盖。

你知道如何解决它吗?

【问题讨论】:

  • 我遇到了完全相同的问题。完全莫名其妙。

标签: c# asp.net-mvc cookies


【解决方案1】:

您不能在纯文本中使用分号作为分隔符。

根据古老的 Netscape cookie_spec:

这个字符串是一个不包括分号、逗号和空格的字符序列。

【讨论】:

    【解决方案2】:

    我刚刚用类似的代码块遇到了这个确切的场景:

    public ActionResult Index(int requestValue)
    {
        var name = "testCookie";
        var oldVal = Request.Cookies[name] != null ? Request.Cookies[name].Value : null;
        var val = (!String.IsNullOrWhiteSpace(oldVal) ? oldVal + ";" : null) + requestValue.ToString();
    
        var cookie = new HttpCookie(name, val)
        {
            HttpOnly = false,
            Secure = false,
            Expires = DateTime.Now.AddHours(1)
        };
    
        HttpContext.Response.Cookies.Set(cookie);
    
        return Content("Cookie set.");
    }
    

    该代码第一次运行时,cookie 将毫无意外地设置。但任何后续运行都不会更新它(值或到期)。

    事实证明,分号是 cookie 值中的非法字符,尝试用它分隔值会导致 cookie 值被截断。如果我们将分号更改为另一个字符,例如竖线 (|),一切正常。

    考虑为 cookie 值发送的标头(由 Fiddler 提供):

    响应发送了 61 字节的 Cookie 数据:

    设置-Cookie: testCookie=2;1;到期=格林威治标准时间 2014 年 9 月 9 日星期二 19:23:43;路径=/

    正如我们所见,分号用于分隔 cookie 定义的各个部分。 因此,如果您想在 cookie 值本身中使用分号,则必须对其进行编码以免被误解。此答案对实际规范进行了更详细的了解:https://stackoverflow.com/a/1969339/143327

    【讨论】:

      【解决方案3】:

      您不能直接修改 cookie。相反,您正在创建一个新的 cookie 来覆盖旧的。 http://msdn.microsoft.com/en-us/library/vstudio/ms178194(v=vs.100).aspx

      试试

      var v = cookie.Value + ";" + key;
      
      Response.Cookies[Constants.PostsViewing].Value = v;
      Response.Cookies[Constants.PostsViewing].Expires = DateTime.Now.AddDays(365);
      

      这应该改变客户端响应而不是服务器请求。

      为了使用 Response.AppendCookie,您首先必须从您的 Cookies 集合中获取一个 HttpCookie。

      【讨论】:

      • 它不起作用。正如我在问题中所写,我已经尝试过了。
      • 此解决方案对该问题无效。
      猜你喜欢
      • 2012-02-13
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      相关资源
      最近更新 更多