使用C# & .NET 7.0无法访问Cookie中数据的问题求助
问题分析
开发者工具能看到Cookie但后端C#读取为空,核心原因有两个:
- Cookie值未编码:JSON序列化后的字符串包含引号、逗号等特殊字符,直接存入会被浏览器截断,导致后端读取到不完整或空值。
- SameSite属性缺失:现代浏览器默认采用
SameSite=Lax策略,未显式声明时,可能在页面跳转或请求过程中Cookie未被正确传递到后端。
解决方案
1. 修改前端Cookie设置逻辑
更新setCookie函数,对Cookie值进行URL编码,并显式添加SameSite属性:
function setCookie(name, value, days) { var expires = ""; if (days) { var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toUTCString(); } // 编码Cookie值,避免特殊字符导致截断 var encodedValue = encodeURIComponent(value); // 显式设置SameSite属性,适配现代浏览器 var newCookie = `${name}=${encodedValue || ""}${expires}; path=/; SameSite=Lax`; console.log(newCookie); document.cookie = newCookie; }
2. 修改后端Cookie读取逻辑
在C#代码中对读取到的Cookie值进行URL解码后,再执行JSON反序列化:
public List<CartItem> CartItems { get; set; } public void OnGet() { CartItems = GetCartItems(); } private List<CartItem> GetCartItems() { var cartCookie = Request.Cookies["cart"]; Console.WriteLine($"cartCookie: {cartCookie}"); if (!string.IsNullOrEmpty(cartCookie)) { try { // 解码Cookie值 var decodedCookie = Uri.UnescapeDataString(cartCookie); return JsonConvert.DeserializeObject<List<CartItem>>(decodedCookie); } catch (Exception ex) { Console.WriteLine($"Error parsing cart cookie: {ex.Message}"); } } return new List<CartItem>(); }
3. 确认CookiePolicy配置
检查Program.cs中的Cookie策略配置,确保允许Cookie被后端读取:
builder.Services.Configure<CookiePolicyOptions>(options => { // 无需用户同意Cookie时设置为false options.CheckConsentNeeded = context => false; options.MinimumSameSitePolicy = SameSiteMode.Lax; }); // 确保在UseRouting之后、UseAuthorization之前调用 app.UseCookiePolicy();
验证步骤
- 清除浏览器中已有的旧Cookie,重新添加商品到购物车。
- 访问
/Cart页面,查看控制台输出,确认cartCookie已读取到有效内容。 - 检查
CartItems是否完成正确的反序列化。
内容的提问来源于stack exchange,提问作者muazfurkan
相关产品推荐
相关产品推荐

