ASP.NET Core中设置Cookie后读取值始终为null的问题及正确读取方法
嘿,这个问题我之前也帮开发者排查过——你之所以刚设置完Cookie就读不到,核心原因是Cookie的传递是基于请求-响应循环的:
你在当前OnGet方法里调用Response.Cookies.Append,是把Cookie添加到要返回给浏览器的响应里,而当前请求的Request对象里,根本还没有这个Cookie。只有当浏览器接收到服务器的响应后,才会把这个Cookie保存到本地存储,等下一次你向服务器发请求时,浏览器才会自动把这个Cookie放到请求头里带过来,这时候服务器才能从Request.Cookies里读到它。
给你两个针对性的解决方案:
如果只是同一个请求内需要用这个值,别折腾Cookie,直接用内存变量
你本来就是在同一个方法里设置又要读取,完全没必要绕Cookie,直接用变量存就行:public async Task OnGet() { // 直接用变量存值,同一请求内随时能用 string userId = "1"; // 设置Session变量 HttpContext.Session.SetString("UserName", "User"); // 向响应添加Cookie(给后续请求用) CookieOptions cookieOptions = new CookieOptions(); HttpContext.Response.Cookies.Append("user_id", userId, cookieOptions); // 直接用userId变量,不用读Cookie cookieValue1 = userId; }如果要在后续请求中读取Cookie,写个新的请求处理方法就行
比如你可以做一个测试页面,或者在同一个页面的下一次请求里读取:// 这是后续请求的处理方法(比如刷新页面后触发的OnGet) public async Task OnGet() { bool hasCookie = Request.Cookies.TryGetValue("user_id", out string strval); cookieValue1 = hasCookie ? strval : null; // 这时候就能正常拿到"1"了 }
额外注意点:
- 别踩大小写的坑:Cookie的键名是区分大小写的,你代码里用的是
"user_id",读取的时候一定要保持完全一致,要是写成"user_Id"就会读不到。 - 检查CookieOptions配置:如果后续请求也读不到,要看看你有没有正确设置
CookieOptions的属性,比如Expires(过期时间)、Domain(域名)、Path(路径),如果配置不对,浏览器可能不会保存这个Cookie。
内容的提问来源于stack exchange,提问作者Heather Shiban
相关产品推荐
相关产品推荐

