与[OutputCache]属性相关的查询

时间:2013-11-23 14:56:46

标签: asp.net-mvc asp.net-mvc-4 razor browser-cache outputcache

为了禁用浏览器缓存,为了可靠地指示浏览器不缓存,我发现最好的解决方案是创建自己的[NoCache]属性类

public class NoCacheSettingsAttribute : 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);
    }
}

全局过滤器设置

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    // Makes sure that cached pages are not served to any browser including chrome
    filters.Add(new NoCacheSettingsAttribute());
}

我想在控制器的某些 ActionResult 中使用[OutputCache(CacheProfile = "2Hour")],并且还希望全局使用 NoCacheSetting 作为其余控制器,让我们说在BaseController中,(所有控制器继承自BaseController)

所以问题是它能正常运作吗?或者我必须将控制器1的其余部分放在一起?

1 个答案:

答案 0 :(得分:1)

为什么不简单地从处理中排除已经使用OutputCache属性修饰的控制器动作:

public class NoCacheSettingsAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var descriptor = new ReflectedControllerDescriptor(
            filterContext.Controller.GetType()
        );

        var action = descriptor.FindAction(
            filterContext.Controller.ControllerContext, 
            filterContext.RequestContext.RouteData.GetRequiredString("action")
        );

        if (!action.GetCustomAttributes(typeof(OutputCacheAttribute), true).Any())
        {
            // The controller action is not decorated with the 
            // [OutputCache] attribute, so you could apply your NoCache logic here

            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();
        }
    }
}