【问题标题】:Change a cookie value of a cookie that already exists更改已存在的 cookie 的 cookie 值
【发布时间】:2025-12-07 06:25:01
【问题描述】:

我有一个名为 SurveyCookie 的 cookie。像这样创建:

var cookie = new HttpCookie("SurveyCookie");
cookie.Values["surveyPage"] = "1";
cookie.Values["surveyId"] = "1";
cookie.Values["surveyTitle"] = "Definietly not an NSA Survey....";
cookie.Values["lastVisit"] = DateTime.UtcNow.ToString();
cookie.Expires = DateTime.UtcNow.AddDays(30);
Response.Cookies.Add(cookie);

效果很好。现在问题来了,当我想像这样更改值“surveyPage”时。

下面将创建一个不是我想要的新 cookie。

int cookieValue = Convert.ToInt32(Request.Cookies["SurveyCookie"]["surveyPage"]) + 1;
Response.Cookies["SurveyCookie"]["surveyPage"] = cookieValue.ToString();

然后我尝试了下面的这段代码,它也不起作用。调查页应该是 2 时仍然是 1。

Request.Cookies["SurveyCookie"]["surveyPage"] = cookieValue.ToString(); 

由于上述两种方法都不起作用,什么会改变surveyPage 的cookie 值?

【问题讨论】:

    标签: c# asp.net-mvc cookies


    【解决方案1】:

    来自ASP.NET Cookies Overview

    您不能直接修改 cookie。相反,更改 cookie 包括创建具有新值的新 cookie,然后发送 cookie 到浏览器以覆盖客户端上的旧版本。

    你可以试试这个:

    HttpCookie cookie = Request.Cookies["SurveyCookie"];
    if (cookie == null)
    {
        // no cookie found, create it
        cookie = new HttpCookie("SurveyCookie");
        cookie.Values["surveyPage"] = "1";
        cookie.Values["surveyId"] = "1";
        cookie.Values["surveyTitle"] = "Definietly not an NSA Survey....";
        cookie.Values["lastVisit"] = DateTime.UtcNow.ToString();
    }
    else
    {
        // update the cookie values
        int newSurveyPage = int.Parse(cookie.Values["surveyPage"]) + 1;
        cookie.Values["surveyPage"] = newSurveyPage.ToString();
    }
    
    // update the expiration timestamp
    cookie.Expires = DateTime.UtcNow.AddDays(30);
    
    // overwrite the cookie
    Response.Cookies.Add(cookie);
    

    【讨论】:

    • 在请求中收到的 cookie 可以具有与之前发送到浏览器的 cookie 不同的属性。例如,当使用 SameSite=Lax 发送 cookie 时,我们会使用 SameSite=None 接收它。当我们更改值并将相同的 cookie 添加到响应时,我们也会向浏览器发送 SameSite 属性更改。
    【解决方案2】:

    每次需要修改现有的 cookie 时,您都应该创建一个新的 cookie,以下对我有用:

    var cookie = new System.Web.HttpCookie("SurveyCookie");
    cookie.Values["surveyPage"] =  newValue;
    cookie.Expires = DateTime.Now.AddDays(1000);
    cookie.SameSite = System.Web.SameSiteMode.None;
    cookie.Secure = true;
    this.HttpContext.Response.Cookies.Add(cookie);
    

    【讨论】:

    • 这是唯一对我有用的东西-谢谢!
    • 这是一个很好的答案,也是唯一对我有用的东西。
    【解决方案3】:

    查看Response.SetCookie() 方法,因为这将设置更新您现有的cookie

    【讨论】:

    • HttpResponse.SetCookie() 支持产品基础架构,不打算直接从您的代码中使用。根据 Microsoft 的 HttpResponse.SetCookie() 文档更新 cookie 的正确方法是 Response.Cookies.Add(MyCookie);。参考msdn.microsoft.com/en-us/library/…底部的例子