Подтвердить что ты не робот

Как недействить данные кэша [OutputCache] из контроллера?

Использование ASP.Net MVC 3 У меня есть контроллер, выход которого кэшируется с использованием атрибутов [OutputCache]

[OutputCache]
public controllerA(){}

Я хотел бы знать, можно ли аннулировать данные кэша (SERVER CACHE) для конкретного контроллера или, как правило, все данные кэша, вызывая другой контроллер

public controllerB(){} // Calling this invalidates the cache
4b9b3361

Ответ 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
{
}