从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依赖,从一个集中的区域控制。
我认为您可以通过在应用程序启动时将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的这篇博文。