我有一个非常奇怪的问题,我完全感到困惑。
我有一段代码可以解析一些数据并使用 Insert 方法将结果存储在我们的网络服务器的 HttpRuntime.Cache 中。这将存储 10 秒。似乎有一些问题,所以我创建了一个测试页面,它从缓存中检索一个简单的对象并显示它是否为空。要将对象添加到缓存中,我使用:
HttpRuntime.Cache.Insert(CHECK_KEY, new object(), null, DateTime.Now.AddSeconds(10), System.Web.Caching.Cache.NoSlidingExpiration);
在测试页面中,我尝试检索对象:
var isInCache = this.cacheService.Get<object>(CHECK_KEY) != null;
cacheService 的方法是:
public T Get<T>(string key)
{
return (T)HttpRuntime.Cache.Get(key);
}
现在奇怪的部分。如果我调用一个调用“Insert”方法的 URL,并转到我的测试页面来检索它,那么大约 99% 的时间isInCache
是的值。false
有时它在整个 10 秒内都能正常工作(例如,我每秒刷新我的测试页面,我得到true
10 次)但同样,大部分时间它只是返回false
。现在,当我按住 F5 时,有时我会在输出中看到true
,眨眼间,这意味着可以找到密钥!这不是一些浏览器缓存,因为它只会true
在 10 秒的缓存持续时间内间歇性闪烁,之后它只会显示 false(这是合乎逻辑的,因为密钥已过期)。所以我的问题是:
- 为什么大多数时候从缓存中检索一个简单的对象会失败?
- 缓存中的其他项目(在同一测试页面上)确实会被检索到,而不是那个对象。
更糟糕的是,这(当然!)在我的本地机器上完美运行,在测试机器上,而不是生产。我很无知。请帮忙 :-)
编辑: 好的,所以我现在在两种不同的浏览器中进行测试,IE9 和 Chrome ......并且 IE9 正确显示了 HttpRuntime.Cache 中的项目,但 Chrome 不是。它总是显示 false 并且没有其他缓存数据,除非按住 F5 时偶尔会显示它。从什么时候开始依赖 HttpRuntime.Cache 浏览器???额外编辑:IE9 不再显示缓存数据。因此,虽然它可能因浏览器而异,但这并不是说 IE 总是可以工作,而 chrome 不能……它不同。
EDIT2: 所以我使用 ViewData 将变量传递给我的视图:
ViewData["machineName"] = machineName;
ViewData["isInCache"] = isInCache;
ViewData["A"] = A;
ViewData["B"] = B;
Machinename 来自 Server.MachineName,isInCache 是对象,变量 A 不是来自 HttpRuntime.Cache,变量 B 是,它也间歇性地不存在。