我有一个运行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
会导致超时错误
答案 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上设置计划任务的指南