1

我在我的 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 时。

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

可能吗?

不管怎么说,还是要谢谢你。

4

1 回答 1

0

您只需要将属性添加到 GlobalFilterCollection

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new DisableCacheFilter());
        filters.Add(new EnableCacheAttribute ());
    }
于 2016-12-02T13:45:41.840 回答