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

Cookie已存在但Request.Cookies抛出NullReferenceException异常

为什么明明Chrome里能看到Cookie,代码读取时却抛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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:43:55