从Global.asax中启用全局缓存

本文关键字:全局 缓存 启用 Global asax | 更新日期: 2023-09-27 17:49:29

我正试图从全局启用服务器端缓存(输出缓存)。

我试过了:

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事件上,就像这个答案一样,没有运气。

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

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

编辑:开始赏金

Steven V的回答把我放在正确的轨道上,但经过几个小时的开发"我自己的缓存系统"扩展ActionFilterAttribute,我有很多问题与线程,响应类型和缓存是混和的结果,所以这是一个完整的灾难(我认为它甚至不值得粘贴代码在这里)。

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

主要思想是有一个全局缓存启用过滤,URL依赖,从一个集中的区域控制。

从Global.asax中启用全局缓存

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

你的Application_Start里可能有RegisterGlobalFilters(GlobalFilters.Filters);。在RegisterGlobalFilters中添加:

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

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

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

如果url (Request.Url.ToString())包含'private'关键字,则跳过缓存。

关于如何构建自定义缓存属性的简单示例,请使用Steven Sanderson的这篇博文。