我有一个MVC 3 c#网站运行,它从webservice中提取记录.随着从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导致超时错误
解决方法
这是一个很棘手的解决方案,但您可以随时在运行可执行文件的服务器上创建一个计划任务.这个可执行文件会点击您网站上的一个特定的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上设置计划任务的指南
>打开开始菜单.>在搜索框中输入“Task Scheduler”(在Windows的旧版本中,我认为这在“管理工具”中被称为“计划任务”).打开任务计划程序结果.>右键单击左侧树的根节点 – “任务计划程序(本地)” – 并选择“创建基本任务”.>给任务一个名称和描述,以便以后识别.点击下一步.>选择你的持续时间(在你的情况下,每天的声音就是右).点击下一步.>如果你想改变开始时间.点击下一步.>将动作留作“启动程序”.点击下一步.>单击“浏览…”,找到您创建的可执行文件.点击下一步.>在最后一个屏幕上,勾选“打开属性对话框…”框,然后单击完成.>将安全选项更改为“运行用户是否登录”.如果需要,将用户或组更改为适当的用户帐户(一个具有运行该exe的必要权限).>单击确定.您将被要求输入将运行该任务的帐户密码.执行此操作并单击确定.>单击左侧的任务计划程序库.您的任务应显示在右侧的列表中.您可以通过右键单击并选择运行来测试它.