从Global.asax全局启用缓存

时间:2014-03-10 11:34:03

标签: c# asp.net-mvc asp.net-mvc-3 caching iis-7.5

我正在尝试从MVC3项目中的Global.asax全局启用服务器端缓存(输出缓存)。

我试过了:

protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (HttpContext.Current.Request.Path.Contains("private"))
        {
            return;
        }
        Response.Cache.SetExpires(DateTime.Now.AddSeconds(300));
        Response.Cache.SetCacheability(HttpCacheability.Server);
        Response.Cache.VaryByHeaders["Host"] = true;
        Response.Cache.VaryByParams["myparam"] = true;
    }

但是,如果我在其中一个页面中放置DateTime.Now,则会在每个请求中进行更改。所以它似乎不起作用。

我也尝试将其置于Application_PreRequestHandlerExecute事件中,如同this answer一样,没有运气。

有没有办法从Global.asax实现这种行为?

注意:我想过滤掉一些缓存的URL。

编辑:开始赏金

史蒂文V的回答让我走上正轨,但经过几个小时的开发“我自己的缓存系统”扩展ActionFilterAttribute,我遇到了很多问题,线程,响应类型和缓存都是混合结果所以它是一个彻底的灾难(我认为这里甚至不值得粘贴代码)。

另一种选择是直接从IIS控制它,如果有一个IIS的缓存模块可以帮助我实现这个或一些配置,而不是在IIS的输出缓存上,这也是非常有帮助的。最后,我尝试实现的是完全与URL相关的。

主要思想是通过过滤,URL依赖,从集中区域控制全局缓存。

2 个答案:

答案 0 :(得分:1)

我认为您可以通过在应用程序启动时向过滤器添加OutputCacheAttribute来实现输出缓存。

RegisterGlobalFilters(GlobalFilters.Filters);中可能Application_Start。所以在RegisterGlobalFilters内添加:

filters.Add(new OutputCacheAttribute { Duration = 300, VaryByHeader = "Host", VaryByParam = "myparam" });

显然,这可能会产生意想不到的副作用,因为几乎所有渲染的内容都会被缓存300秒。如果您不想在每个操作上都有这个操作,我会查看[OutputCache]属性,并装饰您想要缓存的控制器。

答案 1 :(得分:1)

您应该尝试构建自定义缓存属性。

如果url(Request.Url.ToString())包含' private'关键字。

有关如何构建自定义缓存属性的简单示例,请使用Steven Sanderson的blogpost。希望这会有所帮助。