Cookie已存在但Request.Cookies抛出NullReferenceException异常
这个问题我之前也踩过坑!明明在Chrome的Application面板里能看到smbm Cookie,但代码里Request.Cookies["smbm"]["si"]却抛出空引用异常,大概率是这几个场景导致的:
1. Cookie的路径(Path)不匹配
默认情况下,HttpCookie的Path会被设置为当前请求的路径(比如你在/Store/SetCookie这个接口设置Cookie,默认Path就是/Store)。这意味着只有当请求路径包含/Store前缀时,浏览器才会把这个Cookie发送给服务器。如果你的读取代码是在根路径/或者其他非/Store路径下执行,Request.Cookies里就找不到这个Cookie,自然会抛异常。
解决办法:设置Cookie的Path为根路径,让整个站点都能访问到它:
var cookie = new HttpCookie("smbm"); cookie.Values.Add("si", store.Id.ToString()); cookie.Path = "/"; // 关键:设置根路径 Response.Cookies.Add(cookie);
2. 跨请求读取的问题
如果你是在同一个请求里先设置Cookie,然后立即尝试读取,那肯定会失败!因为Response.Cookies.Add(cookie)只是把Cookie标记为要发送给浏览器,浏览器要等到这次请求响应完成后才会保存这个Cookie,下一次请求才会把它带回来。同一个请求里的Request.Cookies是浏览器发送过来的旧数据,根本不会包含刚设置的Cookie。
解决办法:同一个请求里直接用变量存储store.Id,不要读Request.Cookies:
// 设置Cookie的同时,直接把值赋值给_storeId var storeId = store.Id.ToString(); var cookie = new HttpCookie("smbm"); cookie.Values.Add("si", storeId); cookie.Path = "/"; Response.Cookies.Add(cookie); _storeId = int.Parse(storeId); // 直接用变量,不用读Cookie
3. 域名(Domain)设置问题
如果你的站点涉及子域名(比如store.yourdomain.com和www.yourdomain.com),默认的Cookie Domain是当前子域名,这会导致其他子域名下的请求无法读取到这个Cookie。
解决办法:统一设置Cookie的Domain为根域名:
cookie.Domain = "yourdomain.com"; // 替换成你的实际根域名
4. 增加空值检查,避免异常
不管什么情况,都应该增加空值判断来防止空引用异常,这是良好的编码习惯:
if (_storeId == 0) { var smbmCookie = Request.Cookies["smbm"]; if (smbmCookie != null && !string.IsNullOrEmpty(smbCookie["si"])) { int.TryParse(smbCookie["si"], out _storeId); } }
内容的提问来源于stack exchange,提问作者Ortund

