我正在尝试从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。
ActionFilterAttribute
,我遇到了很多问题,线程,响应类型和缓存都是混合结果所以它是一个彻底的灾难(我认为这里甚至不值得粘贴代码)。
另一种选择是直接从IIS控制它,如果有一个IIS的缓存模块可以帮助我实现这个或一些配置,而不是在IIS的输出缓存上,这也是非常有帮助的。最后,我尝试实现的是完全与URL相关的。
主要思想是通过过滤,URL依赖,从集中区域控制全局缓存。
答案 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。希望这会有所帮助。