如何在ASP.NET Core中存储对象到Cookie并保留原始JSON值
问题场景
我有一个想要存储到响应Cookie中的类,代码实现如下:
public IActionResult Get() { var data = JsonConvert.SerializeObject(new DeviceModel { Group = "TEST" }); HttpContext.Response.Cookies.Append("dv-v3", data); return Ok(); } public class DeviceModel { [JsonProperty(PropertyName = "g")] public string Group { get; set; } [JsonProperty(PropertyName = "platform")] public string Platform { get; set; } }
但存储后Cookie的值被URL编码为:
dv-v3=%7B%22g%22%3A%22TEST%22%2C%22platform%22%3Anull%7D; path=/
我希望Cookie的值保持为原始JSON格式:
{"g":"TEST","platform":null}
解决方案
ASP.NET Core里Response.Cookies.Append方法默认会对Cookie值做URL编码,要跳过编码,使用带CookieOptions的重载,给Encode属性设置一个直接返回原字符串的自定义编码器即可。
修改后的代码如下:
public IActionResult Get() { var data = JsonConvert.SerializeObject(new DeviceModel { Group = "TEST" }); var cookieOptions = new CookieOptions { // 自定义编码器,直接返回原始字符串,不做编码处理 Encode = value => value }; HttpContext.Response.Cookies.Append("dv-v3", data, cookieOptions); return Ok(); } public class DeviceModel { [JsonProperty(PropertyName = "g")] public string Group { get; set; } [JsonProperty(PropertyName = "platform")] public string Platform { get; set; } }
注意事项
- 虽然可以跳过编码,但要遵循Cookie的RFC规范:Cookie值本身不允许包含空格、逗号、分号等特殊字符,原始JSON里的双引号在多数现代浏览器中能正常解析,但部分旧浏览器或代理服务器可能出现解析异常。
- 若必须存储原始JSON,需确认业务场景下所有客户端都能正确处理未编码的Cookie值。
内容的提问来源于stack exchange,提问作者Farhad Zamani
相关产品推荐
相关产品推荐

