1

我有一个非常奇怪的问题,我完全感到困惑。

我有一段代码可以解析一些数据并使用 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 秒内都能正常工作(例如,我每秒刷新我的测试页面,我得到true10 次)但同样,大部分时间它只是返回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 是,它也间歇性地不存在。

4

1 回答 1

1

经过大量调试和思考,托管服务提供商似乎将 IIS 7 应用程序池设置中的“最大工作进程”设置为大于 1 的值。 HttpRuntime.Cache 未在网络场中共享,因此很可能是我点击了没有缓存对象的“错误”实例。连续按 F5 会让我偶尔点击确实缓存了值的实例。

于 2012-06-15T13:44:13.023 回答