无法在asp.net mvc中更新cookie

本文关键字:更新 cookie mvc net asp | 更新日期: 2023-09-27 18:20:49

我可以写和读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文件应该是owerwrited。

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

你知道怎么修吗?

无法在asp.net mvc中更新cookie

我刚刚遇到了一个带有类似代码块的确切场景:

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 GMT;路径=/

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

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

根据古老的网景食谱:

此字符串是一系列字符,不包括分号、逗号和空格。

您不能直接修改cookie。相反,你正在创建一个新的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,您首先必须从Cookie集合中获取HttpCookie。