我正在尝试从 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/