Как недействить данные кэша [OutputCache] из контроллера?
Использование ASP.Net MVC 3 У меня есть контроллер, выход которого кэшируется с использованием атрибутов [OutputCache]
[OutputCache]
public controllerA(){}
Я хотел бы знать, можно ли аннулировать данные кэша (SERVER CACHE) для конкретного контроллера или, как правило, все данные кэша, вызывая другой контроллер
public controllerB(){} // Calling this invalidates the cache
Ответы
Ответ 1
Вы можете использовать метод RemoveOutputCacheItem
.
Вот пример того, как вы могли его использовать:
public class HomeController : Controller
{
[OutputCache(Duration = 60, Location = OutputCacheLocation.Server)]
public ActionResult Index()
{
return Content(DateTime.Now.ToLongTimeString());
}
public ActionResult InvalidateCacheForIndexAction()
{
string path = Url.Action("index");
Response.RemoveOutputCacheItem(path);
return Content("cache invalidated, you could now go back to the index action");
}
}
Реакция действия индекса кэшируется на сервере в течение 1 минуты. Если вы нажмете на действие InvalidateCacheForIndexAction
, оно закончит кеш для действия индекса. В настоящее время нет способа сделать недействительным весь кеш, вы должны сделать это за кешированное действие (не контроллер), потому что метод RemoveOutputCacheItem
ожидает URL-адрес серверной стороны script, который он кэшировал.
Ответ 2
Это можно сделать с помощью настраиваемого атрибута:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : 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);
}
}
Затем на вашем controllerb
вы можете сделать:
[NoCache]
public class controllerB
{
}