在某个时间安排每天刷新HttpContext.Cache的任务

时间:2013-02-25 09:19:20

标签: c# asp.net-mvc-3 caching scheduled-tasks httpcontext.cache

我有一个运行MVC 3 c#的网站从web服务中提取记录。随着它从Web服务获取的数据集变得越来越大,我正在寻找一种方法,在没有当前缓存的情况下,第一个用户不会在没有当前缓存的情况下触发创建缓存,而是按照每日计划(像cron工作,预定任务或其他什么)。

我该怎么做? 我是否需要某种触发器库,如Quartz.net? (我宁愿使用更简单的解决方案)

我现在在控制器中拥有的是:

private List<DataSummary> GetSummaries()
    {
        //get summaries from cache if available
        List<DataSummary> summaries = (List<DataSummary>)HttpContext.Cache["SummariesCache"];
        if (summaries == null)
        {
            //cache empty, retrieve values
            summaries = _webservice.GetSummaries();
            //cache it
            HttpContext.Cache.Add("SummariesCache", summaries, null, DateTime.Now.AddHours(12), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
        }
        return summaries;

    }

修改

使用CacheItemRemovedCallback会导致超时错误

1 个答案:

答案 0 :(得分:2)

这是一个hacky解决方案,但您始终可以在运行可执行文件的服务器上创建计划任务。此可执行文件会访问您网站上的特定URL,而后者又会按照您上面概述的方式填充缓存。要点击可执行文件中的URL,您需要这些内容:

var req = (HttpWebRequest)WebRequest.Create(URL);
req.Timeout = 30000;        
req.KeepAlive = false;
req.Method = "GET";
var res = (HttpWebResponse)req.GetResponse();
if (res.StatusCode == HttpStatusCode.OK){
    // Your cache should be refreshed
}

创建计划任务也非常简单 - 只需确保在对您创建的exe具有执行权限的用户帐户中运行它,并且不要求用户登录以启动任务。 / p>

编辑:添加了在Windows Server 2008上设置计划任务的指南

  1. 打开开始菜单。
  2. 在搜索框中键入“任务计划程序”(在旧版本的Windows中,我认为在管理工具中可以找到“计划任务”)。打开任务计划程序结果。
  3. 右键单击左侧树的根节点 - “Task Scheduler(local)” - 并选择“Create Basic Task”。
  4. 为任务指定名称和说明,以便日后识别。点击下一步。
  5. 选择您的持续时间(在您的情况下,每日听起来是正确的)。点击下一步。
  6. 根据需要更改开始时间。点击下一步。
  7. 将操作保留为“启动程序”。点击下一步。
  8. 点击“浏览...”,找到您创建的可执行文件。点击下一步。
  9. 在最后一个屏幕上,勾选“打开属性对话框...”框,然后单击“完成”。
  10. 将安全选项更改为“运行用户是否登录”。如有必要,请将用户或组更改为适当的用户帐户(具有运行exe的必要权限的帐户)。
  11. 单击“确定”。系统将要求您输入将运行该任务的帐户密码。执行此操作,然后单击“确定”。
  12. 单击左侧的任务计划程序库。您的任务应出现在右侧的列表中。您可以通过右键单击并选择“运行”来测试它。