c# - 从 Global.asax 全局启用缓存

标签 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,使其不被缓存。

编辑:开始赏金

Steven V 的回答让我走上了正轨,但在开发扩展 ActionFilterAttribute 的“我自己的缓存系统”几个小时后,我在线程、响应类型和缓存方面遇到了很多问题,结果是混搭的所以这完全是一场灾难(我认为甚至不值得在这里粘贴代码)。

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

主要思想是启用全局缓存,并启用过滤、URL 依赖、从集中区域进行控制。

最佳答案

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

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

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

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

关于c# - 从 Global.asax 全局启用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22298999/

相关文章:

c# - 如何在 C# 中将元组转换为数组?

javascript - 如何将 ViewModel 中的数据发布到 Controller 方法中?

asp.net-mvc-3 - 从 Ajax.BeginForm 调用 ActionResult

c# - 根据 .config 文件中的设置选择注入(inject)构造函数

asp.net-mvc - ASP.NET MVC 中的数据注释

c# - 拦截方法调用

C# - 在子类中调用个别行为后在抽象类中添加公共(public)行为

c# - C# 中奇怪的循环

jquery - 如何使用 JQuery 发送 Escape 键

asp.net-mvc - MVC .NET如何在现有源代码中添加单元测试项目?