除了特定操作的控制器之外,在我的MVC项目中禁用缓存

时间:2012-11-23 11:46:40

标签: asp.net-mvc asp.net-mvc-4

我在Visual Studio 2012 ASP.NET MVC4解决方案上工作。我忙于缓存部分。我想没有控制器缓存的动作,除了一些属性标记的特定动作。

以下是我的工作:

我定义了一个动作过滤器:

public class DisableCacheFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Without caching
        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();
    }
}

因此,无论何时触发某个操作,我都不会在下次触发此操作时进行缓存。

接下来,我在Global.asax中注册此过滤器:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new DisableCacheFilter());
    }

接下来,我创建了一个EnableCache属性:

public class EnableCacheAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // With caching of one day
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(true);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.Public);
    }
}

因此,每当使用EnableCache属性修饰当前操作时,我想缓存它。因此,下次触发相同的操作(从客户端浏览器),不会进行任何调用。

示例:

    [EnableCache]
    public JsonResult GetPostCode(int countryID, string term)
    {
    ....
    }

它不起作用,因为每次调用过滤器DisableCache。

所以在简历中:我想禁用任何缓存(来自浏览器),只缓存特定的操作(可能由属性标记)。

有可能吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

您只需将该属性添加到GlobalFilterCollection

即可
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new DisableCacheFilter());
        filters.Add(new EnableCacheAttribute ());
    }