MVC在一天的特定时间后清除缓存

时间:2017-05-02 00:00:11

标签: asp.net-mvc caching outputcache

我有一个带OutputCache属性的控制器操作,如下所示:

[OutputCache(Duration = 14400)] // 4 hours
public ActionResult Index()
{
    var model = // fill out model

    return View(model);
}

所以我将动作缓存了4个小时。我想做的是无论这4小时有多长,如果在10pm晚上之后,我想重置/清除缓存。这可能吗?

2 个答案:

答案 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小时为您提供一个新的缓存密钥:

  • 适用于9/7/2017 6:00:40 PM的CacheKey-4
  • 适用于9/7/2017 7:00:40 PM的CacheKey-4
  • 适用于9/7/2017 8:00:40 PM的CacheKey-4
  • 适用于9/7/2017 9:00:40 PM的CacheKey-4
  • CacheKey-5 for 9/7/2017 10:00:40 PM< - new at at 10 PM!
  • 适用于9/7/2017 11:00:40 PM的CacheKey-5
  • 适用于9/8/2017 12:00:40 AM的CacheKey-5
  • 适用于9/8/2017 1:00:40 AM的CacheKey-5
  • CacheKey-0 for 9/8/2017 2:00:40 AM< - new因为它已经4小时
  • CacheKey-0 for 9/8/2017 3:00:40 AM
  • 适用于9/8/2017 4:00:40 AM的CacheKey-0
  • CacheKey-0 for 9/8/2017 5:00:40 AM
  • CacheKey-1 for 9/8/2017 6:00:40 AM< - new因为已经4小时
  • 适用于9/8/2017 7:00:40 AM的CacheKey-1
  • 适用于9/8/2017 8:00:40 AM的CacheKey-1
  • 适用于9/8/2017 9:00:40 AM的CacheKey-1
  • CacheKey-2 for 9/8/2017 10:00:40 AM< - new因为已经4小时
  • CacheKey-2 for 9/8/2017 11:00:40 AM
  • CacheKey-2 for 9/8/2017 12:00:40 PM
  • 适用于9/8/2017 1:00:40 PM的CacheKey-2
  • CacheKey-3 for 9/8/2017 2:00:40 PM< - new因为已经4小时
  • 适用于9/8/2017 3:00:40 PM的CacheKey-3
  • 适用于9/8/2017 4:00:40 PM的CacheKey-3
  • 适用于9/8/2017 5:00:40 PM的CacheKey-3