我可以将VaryByCustom与Sitecore 7控制器渲染一起使用吗?

时间:2014-01-22 15:13:06

标签: c# sitecore outputcache sitecore7

我有一个Sitecore 7控制器渲染。我需要通过自定义方法改变OutputCache。

渲染当前在Sitecore中设置为“Cachable”,“VaryByData”和“VaryByParm”。

我已为我的操作添加了输出缓存属性,并设置了自定义变量字符串:

[OutputCache(VaryByCustom = "ThisIsATest", Duration = 60)]
public ActionResult Index()
{
    ...
}

我的Global.asax继承自Sitecore.Web.Application,我按以下方式覆盖了GetVaryByCustomString:

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    if (custom == "ThisIsATest")
        return "some custom key";
    return base.GetVaryByCustomString(context, custom);
}

我从来没有看到过GetVaryByCustomString方法,并且控制器的行为似乎根本就没有OutputCache属性......就好像它实际上只是做了默认的“Cachable”,“VaryByData” “,”VaryByParm“来自Sitecore的行为。

任何线索?

1 个答案:

答案 0 :(得分:10)

好的,我就是这样做的。

我在/sitecore/templates/System/Layout/Sections/Caching上添加了一个名为“VaryByMyCustomThing”的复选框字段。

然后我用自定义实现替换了Sitecore.Mvc.config中的“GenerateCacheKey”管道。我取代了这个:

<processor type="Sitecore.Mvc.Pipelines.Response.RenderRendering.GenerateCacheKey, Sitecore.Mvc"/>

有了这个:

<processor type="My.Site.Pipelines.GenerateCustomCacheKey, My.Site"/>

我的GenerateCustomCacheKey类如下所示:

using System.Net.Http;
using System.Web;
using Sitecore.Mvc.Extensions;
using Sitecore.Mvc.Pipelines.Response.RenderRendering;
using Sitecore.Mvc.Presentation;

namespace My.Site.Pipelines
{
    public class GenerateCustomCacheKey : GenerateCacheKey
    {
        protected override string GenerateKey(Rendering rendering, RenderRenderingArgs args)
        {
            var varyByCountryCode = rendering.RenderingItem.InnerItem["VaryByMyCustomThing"].ToBool();

            var key = base.GenerateKey(rendering, args);
            if (varyByCountryCode)
                key = key + GetCountryCodePart(rendering);
            return key;
        }    

        protected string GetCountryCodePart(Rendering rendering)
        {
            return "_#countryCode:" + (string)HttpContext.Current.Session["CountryCode"];
        }
    }
}