Sitecore 在 mvc.renderRendering 管道中定义的处理器的帮助下对 MVC 渲染应用缓存。
SetCacheability处理器根据渲染的缓存渲染参数和站点上下文检测是否应该启用缓存。
GenerateCacheKey处理器根据渲染的缓存渲染参数生成缓存key。
RenderFromCache 处理器如果找到给定缓存键的缓存输出,则会以缓存输出进行响应。
最后,AddRecordedHtmlToCache 在渲染可缓存渲染时缓存输出。
如何启用页面级缓存(在 Sitecore 8.2 Update 4 上测试)
假设代表页面的 Sitecore 项目继承自名为 Base page
的模板
将位于/sitecore/templates/System/Layout/Sections/Caching 的缓存 模板{E8D2DD19-1347-4562-AE3F-310DC0B21A6C} 添加到基本页面的基本模板。
从基本页面继承的每个 Sitecore 页面项目现在都可以访问与渲染相同的缓存字段。
这个想法是在SetCacheability 之前添加一个新处理器。
此处理器检测layout 渲染类型。
如果关联的 Sitecore 项目启用了缓存,它会将缓存定义复制到此渲染中。
此处理器的代码(它使用 Glass Mapper,但更改起来很简单):
public class SetPageCaching : RenderRenderingProcessor
{
public SetPageCaching() { }
ISitecoreContext GetSitecoreContext() => SitecoreContextFactory.Default?.GetSitecoreContext();
public override void Process(RenderRenderingArgs args)
{
if (IsPageRendering(args.Rendering) && args.Rendering?.Item != null)
{
var caching = GetSitecoreContext()?.Cast<ICaching>(args.Rendering.Item);
// the cast above always returns an item even if the item doesn't inherit the Caching template
// we check Cacheable property to verify if it has been mapped.
// Value of false for Cacheable property means that
// the item doesn't inherit the "Caching" template or Cacheable prop value is false
// we only do something for page items that are marked as cacheable
if (caching?.Cacheable ?? false)
{
UpdateRenderingCachingDefinition(caching, args.Rendering.Caching);
}
}
}
static bool IsPageRendering(Rendering rendering) => rendering?.RenderingType == RenderingTypes.Layout;
static void UpdateRenderingCachingDefinition(ICaching caching, RenderingCachingDefinition def)
{
if (caching == null || def == null) return;
def.Cacheable = caching.Cacheable;
def.VaryByData = caching.VaryByData;
def.VaryByDevice = caching.VaryByDevice;
def.VaryByLogin = caching.VaryByLogin;
def.VaryByParameters = caching.VaryByParam;
def.VaryByUser = caching.VaryByUser;
}
}
[SitecoreType(AutoMap = true, TemplateId = "{E8D2DD19-1347-4562-AE3F-310DC0B21A6C}")]
public interface ICaching
{
[SitecoreField(FieldId = "{3D08DB46-2267-41B0-BC52-BE69FD618633}")]
bool Cacheable { get; set; }
[SitecoreField(FieldId = "{F3E7E552-D7C8-469B-A150-69E4E14AB35C}")]
bool ClearOnIndexUpdate { get; set; }
[SitecoreField(FieldId = "{8B6D532B-6128-4486-A044-CA06D90948BA}")]
bool VaryByData { get; set; }
[SitecoreField(FieldId = "{C98CF969-BA71-42DA-833D-B3FC1368BA27}")]
bool VaryByDevice { get; set; }
[SitecoreField(FieldId = "{8D9232B0-613F-440B-A2FA-DCDD80FBD33E}")]
bool VaryByLogin { get; set; }
[SitecoreField(FieldId = "{3AD2506A-DC39-4B1E-959F-9D524ADDBF50}")]
bool VaryByParam { get; set; }
[SitecoreField(FieldId = "{0E54A8DC-72AD-4372-A7C7-BB4773FAD44D}")]
bool VaryByUser { get; set; }
}
在 mvc 管道中添加此处理器的配置(将 MyAssembly.SetPageCaching, MyAssembly 更改为您自己的类型):
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:set="http://www.sitecore.net/xmlconfig/set/">
<sitecore>
<pipelines>
<mvc.renderRendering>
<processor type="MyAssembly.SetPageCaching, MyAssembly" patch:before="processor[@type='Sitecore.Mvc.Pipelines.Response.RenderRendering.SetCacheability, Sitecore.Mvc']" />
</mvc.renderRendering>
</pipelines>
</sitecore>
</configuration>