修改现有Cookie值异常:值被追加而非覆盖,求排查问题
你遇到的问题核心是把单值Cookie当成多值Cookie来修改了,咱们一步步拆解原因:
原来的SkillId Cookie是个单值Cookie,它的取值"112"直接存在cookie.Value属性里。但你用了cookie.Values["SkillId"]来赋值——Values属性是专门用来处理多值Cookie的(即一个Cookie里包含多个键值对,格式类似key1=value1&key2=value2)。
当你访问cookie.Values时,ASP.NET会自动把原来的单值字符串"112"解析成一个NameValueCollection:因为这个字符串没有=分隔的键值对,它会把整个"112"当成一个无键的项。之后你再给Values["SkillId"]赋值,就相当于在这个集合里新增了一个键值对,最终Cookie的值就变成了112&SkillId=189——也就是原来的无键项加上新的键值对,自然达不到替换的效果。
正确的修改方式
方式一:保持单值Cookie(推荐,匹配你的原始需求)
直接修改cookie.Value属性,而非Values集合,这才是单值Cookie的正确修改姿势:
string qualifyBySkill = "189"; HttpCookie cookie = Request.Cookies["SkillId"]; if (cookie != null) { // 直接替换Cookie的单值内容 cookie.Value = qualifyBySkill; } else { // 如果Cookie不存在,创建新的单值Cookie cookie = new HttpCookie("SkillId", qualifyBySkill); } cookie.Expires = DateTime.UtcNow.AddDays(1); Response.Cookies.Add(cookie);
方式二:如果需要使用多值Cookie(仅当你需在一个Cookie中存储多个键值对时)
如果一开始就打算用多值Cookie,创建和修改都要通过Values集合操作:
string qualifyBySkill = "189"; HttpCookie cookie = Request.Cookies["SkillId"]; if (cookie != null) { // 修改多值Cookie中的指定键对应的值 cookie.Values["SkillId"] = qualifyBySkill; } else { // 创建新的多值Cookie并赋值 cookie = new HttpCookie("SkillId"); cookie.Values["SkillId"] = qualifyBySkill; } cookie.Expires = DateTime.UtcNow.AddDays(1); Response.Cookies.Add(cookie);
内容的提问来源于stack exchange,提问作者Huma Ali
相关产品推荐
相关产品推荐

