【问题标题】:Stop EPiServer clearing output cache on publish停止 EPiServer 在发布时清除输出缓存
【发布时间】:2016-05-11 17:35:02
【问题描述】:

这不是我见过的问题,通常是“EPiServer 没有清除输出缓存”。我试图达到相反的效果。每次发布页面时,都会删除整个缓存,并且客户端每天发布几次,这令人沮丧。

我正在使用 [ContentOutputCache] 属性并尝试在 EPiServer 中实现带有随附计划任务的 httpCacheVaryByCustom 规则,以在我们决定将更新捆绑在一起并在预定时间失效时使缓存失效。

我已经测试了这条规则,它可以使用:

public override string GetVaryByCustomString(HttpContext context, string custom)

我的印象是,通过使用这种类型的缓存规则,每当发布/上传媒体时,EPiServer 都会停止转储我的缓存。

但有没有办法阻止这种情况发生?

我通过使用标准 [OutputCache] 和相同的自定义字符串规则取得了成功,唯一的问题是编辑者总是会看到他们正在编辑的页面的缓存版本。

我在 EPiServer 的 web.config 中的应用程序设置是:

<applicationSettings globalErrorHandling="Off" operationCompatibility="DynamicProperties" uiSafeHtmlTags="b,i,u,br,em,strong,p,a,img,ol,ul,li" disableVersionDeletion="false" 
                     httpCacheability="Public" uiEditorCssPaths="~/assets/css/styles.css, ~/assets/css/editor.css" urlRebaseKind="ToRootRelative" 
                     pageUseBrowserLanguagePreferences="false" uiShowGlobalizationUserInterface="false" subscriptionHandler="EPiServer.Personalization.SubscriptionMail,EPiServer" 
                     uiMaxVersions="20" pageValidateTemplate="false" utilUrl="~/util/" 
                     uiUrl="~/EPiServer/CMS/" httpCacheExpiration="01:00:00"  httpCacheVaryByCustom="invalidateSiteCache" />

【问题讨论】:

  • 您的 web.config 中有哪些内容用于 ContentOutputCache?
  • 嗨 Ollie,我已经从上面的 web.config 添加了应用程序设置。
  • 我明白你的意思我的 web.config 中没有 outputCache 将添加这个

标签: caching outputcache episerver


【解决方案1】:

自定义GetVaryByCustomString 函数将确定缓存何时失效,但任何使用ContentOutputCache 的内容请求都会根据主缓存键Episerver.DataFactoryCache.Version 进行检查。此版本号会在任何时候发布、更新等内容时递增,如果版本号更改,则缓存将失效。

要了解您需要做什么,我建议使用反编译器(例如 DotPeek)并查看 Episerver dll 中的 ContentOutputCacheAttributeOutputCacheHandler 类。

您需要:

  1. EPiServer.Web.OutputCacheHandler 派生新的处理程序
  2. 创建 ValidateOutputCache(...) 的替代方法,该方法仍调用 OutputCacheHandler.UseOutputCache(...) 但忽略缓存版本号
  3. ContentOutputCacheAttribute 派生新属性
  4. 使用与当前方法相同的逻辑覆盖方法OnResultExecuting(ResultExecutingContext filterContext)(这是反编译器很有用的地方),但这会向您的新验证方法添加回调而不是当前方法。不幸的是,我们无法注入新的处理程序,因为 validate 方法是静态传递的。

例如

public override void OnResultExecuting(ResultExecutingContext filterContext)
{        
    // Rest of method
    filterContext.HttpContext.Response.Cache.AddValidationCallback(new HttpCacheValidateHandler(CustomOutputCacheHandler.CustomValidateOutputCache), (object) tuple);
}
  1. 使用新属性代替[ContentOutputCache]

【讨论】:

  • 感谢您的回答 Ollie,我终于知道 EPiServer 丢弃缓存的原因和方式了。使用 [OutputCache] 属性的唯一问题是编辑者在发布对页面的任何更改后会看到页面的缓存版本。除非我们在发布后删除缓存,这是我试图避免的。我所追求的是保持 EPiServers 缓存功能的能力,该功能允许编辑者查看未缓存的站点,而当前的直播仍然被缓存。我只想在每次发布后停止缓存下降,解决方案似乎很难实现。
  • 对不起,我看错了那部分。认为它仍然可能,我会更新我的答案。
  • 感谢奥利,那会很棒!
  • 嗨,Ollie,我觉得我们快要解决这个问题了,但它仍然不能正常工作。在调试模式下,我可以看到我的新 CustomValidateOutputCache 被调用,并且在发布后按预期返回缓存有效。然而缓存仍然被丢弃......不知何故。使用 DotPeek(谢谢)我想也许我还需要覆盖 SetCachePolicy?你怎么看?我想知道 EPiServer 是否在发布时清空其他地方的缓存。
  • 我刚刚在 EPiServer.dll 的 Publish 方法下看到了 this._cacheManager.RemoveLocal(DataFactoryCache.ContentVersionCacheKey(saveEventArgs.ContentLink));我想知道这是否是罪魁祸首。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 2018-02-16
  • 1970-01-01
  • 2017-12-21
  • 2011-10-05
相关资源
最近更新 更多