10

我有一个 MVC 3 c# 网站正在运行,它从 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导致超时错误

4

1 回答 1

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
}

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

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

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