You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core控制器无法获取JSON格式Cookie问题求助

解决Cookie无法读取JSON格式值的问题

问题原因

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:26:00