ASP.NET Core控制器无法获取JSON格式Cookie问题求助
问题原因
Cookie的Value不允许包含未转义的特殊字符(比如双引号"),直接存储{"2":3}这类原始JSON字符串时,浏览器会因语法不规范无法正确识别该Cookie,导致服务器端读取不到。而{2:3}没有双引号,属于浏览器可接受的格式,所以能正常读取。
解决方案
1. 设置Cookie时对JSON字符串做URL编码
无论是后端还是前端设置Cookie,都需要先将JSON字符串进行URL编码,转义特殊字符:
后端(C#)设置示例:
// 序列化字典为JSON字符串 var cartDict = new Dictionary<string, int> { { "2", 3 } }; var cartJson = JsonSerializer.Serialize(cartDict); // URL编码处理 var encodedCartJson = Uri.EscapeDataString(cartJson); // 添加Cookie,注意设置Path确保全站可访问 Response.Cookies.Append( "CartItems", encodedCartJson, new CookieOptions { Path = "/", Expires = DateTimeOffset.Now.AddDays(7) } );
前端(JavaScript)设置示例:
const cart = { "2": 3 }; const cartJson = JSON.stringify(cart); // URL编码处理 const encodedCartJson = encodeURIComponent(cartJson); // 设置Cookie,指定Path document.cookie = `CartItems=${encodedCartJson}; path=/; expires=${new Date(Date.now() + 7*24*60*60*1000).toUTCString()}`;
2. 读取Cookie时先解码再反序列化
在控制器中读取Cookie后,先进行URL解码,再反序列化JSON:
public async Task<IActionResult> Confirm() { if (HttpContext.Request.Cookies.TryGetValue("CartItems", out var encodedCookieValue)) { // URL解码 var cookieValue = Uri.UnescapeDataString(encodedCookieValue); var cart = JsonSerializer.Deserialize<Dictionary<string, int>>(cookieValue); // 后续业务逻辑 } // 处理Cookie不存在的情况 return View(); }
3. 额外检查项
- 确保Cookie的
Path设置为/,避免因路径限制导致控制器所在路由无法访问该Cookie。 - 若设置了
HttpOnly属性,前端无法修改该Cookie,但后端读取不受影响;如果是前端设置Cookie,不要添加HttpOnly。 - 检查
SameSite属性,根据业务场景设置为Lax、Strict或None(需配合Secure属性),避免跨域或跨站点访问限制。
内容的提问来源于stack exchange,提问作者CortezZ-1
相关产品推荐
相关产品推荐

