最近,我一直在尝试缓存对象,HttpRuntime.Cache
我通常的印象是,如果我像这样“添加”一些东西到缓存中:
HttpRuntime.Cache.Insert("Test", "This is a test!", null,
Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, new CacheItemRemovedCallback(FileChanged));
“NotRemovable”和“NoExpiration”标志将在应用程序期间将对象保留在内存中。但是发现在某些页面请求结束时, HttpRuntime.Cache 将完全为空!
通过跟踪并在我的回调“FileChanged”中设置断点,我可以看到确实有些东西正在“删除”我的对象(以及缓存中的所有其他对象),但我不知道为什么。所以最终,我开始禁用我认为可能会影响这个子系统的其他东西。
最后,我注释掉了这一行:
WebConfigurationManager.OpenWebConfiguration("~").Save;
我主要从 AppSettings 区域的“web.config”中检索数据,但偶尔会写回 AppSettings 并使用上述命令保存更改。我从阅读中知道“web.config”被缓存了,但是将我的更改保存回它不应该刷新所有的 HttpRuntime.Cache,对吧?
这是一个错误吗?或者这两个缓存是否以某种我应该知道的方式链接在一起?
编辑:
好的,如果有人想在自己的机器上尝试这个,我已经让这个超级重现。(我正在运行针对 .NET 3.5 的带有 MVC2 的 VS2008 Pro)只需启动一个新的 MVC2 项目并将以下内容粘贴到HomeController
已经存在的内容中:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Configuration;
using System.Configuration;
namespace BackButtonTest.Controllers
{
[HandleError]
public class HomeController : Controller
{
private string MESSAGE = "Message";
public ActionResult Index()
{
ViewData[MESSAGE] = HttpRuntime.Cache.Get(MESSAGE);
Configuration Config = WebConfigurationManager.OpenWebConfiguration("~");
Config.AppSettings.Settings.Add("SomeKey", "SomeValue");
Config.Save();
return View();
}
public ActionResult About()
{
HttpRuntime.Cache[MESSAGE] = "This is pulled from the HttpRuntime.Cache";
return View();
}
}
}
然后按照以下步骤操作:
- 在调试模式下启动应用程序。
- 点击“关于”链接。这会将字符串加载到缓存中。
- 点击“主页”链接。字符串从缓存中拉出并卡在 ViewMessage 字典中。一些键/值对被写入 web.config 并保存。缓存中的字符串应出现在主页上。
- 再次单击“主页”链接。应该从缓存中提取字符串,但事实并非如此。
- 停止程序。注释掉以“Config”开头的 3 行。重新启动程序。
- 再次尝试步骤 1 到 4。注意 HttpRuntime.Cache 没有被清空。
很奇怪吧?