1

最近,我一直在尝试缓存对象,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();
        }
    }
}

然后按照以下步骤操作:

  1. 在调试模式下启动应用程序。
  2. 点击“关于”链接。这会将字符串加载到缓存中。
  3. 点击“主页”链接。字符串从缓存中拉出并卡在 ViewMessage 字典中。一些键/值对被写入 web.config 并保存。缓存中的字符串应出现在主页上。
  4. 再次单击“主页”链接。应该从缓存中提取字符串,但事实并非如此。
  5. 停止程序。注释掉以“Config”开头的 3 行。重新启动程序。
  6. 再次尝试步骤 1 到 4。注意 HttpRuntime.Cache 没有被清空。

很奇怪吧?

4

1 回答 1

2

写入您的 web.config 将强制应用程序重新启动,并且很可能,用于清空缓存、进程内会话状态等的事件将消失。尝试在 global.asax Application_End 中写下一些日志(或任何方法的名称 :))

于 2010-10-19T21:59:46.633 回答