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

Dan*_*ulp 10 c# caching scheduled-tasks httpcontext.cache asp.net-mvc-3

我有一个运行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;

    }
Run Code Online (Sandbox Code Playgroud)

编辑

使用CacheItemRemovedCallback导致超时错误

Mal*_*ric 2

这是一个有点棘手的解决方案,但您始终可以在运行可执行文件的服务器上创建计划任务。此可执行文件会访问您网站上的特定 URL,该 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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