我有一个带OutputCache
属性的控制器操作,如下所示:
[OutputCache(Duration = 14400)] // 4 hours
public ActionResult Index()
{
var model = // fill out model
return View(model);
}
所以我将动作缓存了4个小时。我想做的是无论这4小时有多长,如果在10pm
晚上之后,我想重置/清除缓存。这可能吗?
答案 0 :(得分:0)
DateTime expireWeights = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59, 999); Cache.Insert("CacheItemName", list, null, expireWeights, System.Web.Caching.Cache.NoSlidingExpiration);
您可以在Cache对象上设置absoluteExpiration时间,这是一个DateTime。
您还可以将absoluteExpiration与SqlCacheDependency结合使用。
关于缓存过期时不提取新数据的问题:您可以连接CacheItemRemovedCallback以接收过期时间的通知,并在那时刷新缓存。
OR 在模型中
public class NoCache : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
base.OnResultExecuting(filterContext);
}
}
控制器: -
[NoCache]
[Authorize]
public ActionResult Home()
{
////////...
}
您必须使用以下行代码设置到期日期:DateTime.UtcNow.AddMinutes(1350)。 否则(1350 * 60) - >每次操作调用
时,持续时间和控制器都必须通过您的文件[OutputCache(Duration = 81000, VaryByParam = "none")]
public ActionResult Index()
{
//reset cache
User u = new User();
return Content(u.getCountryDetails());
//send notification
}
或 您可以在控制器中的HttpContext.Response中添加标题
HttpContext.Response.Headers.Add("refresh", "1350; url=" + Url.Action("Index"));
有许多方法可以缓存,它可以舒适地使用。
希望帮助你。
答案 1 :(得分:0)
你对这个问题的看法让它太复杂了。如果您想在晚上10点无效并缓存4小时,则缓存总是相同,因此新缓存将在晚上10点,凌晨2点,早上6点等启动。
我认为你可以像这样实现它:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (!string.IsNullOrWhiteSpace(custom))
{
switch (custom)
{
case "4HoursStart10":
var baseDate = DateTime.Now.AddHours(-2);
return "CacheKey-" + (baseDate.Hour / 4);
break;
}
}
return base.GetVaryByCustomString(context, custom);
}
这将每4小时为您提供一个新的缓存密钥: