2014-01-22 5 views
5

Ich habe einen Sitecore 7 Controller Rendering. Ich muss den OutputCache durch eine benutzerdefinierte Methode variieren.Kann ich VaryByCustom mit einem Sitecore 7 Controller Rendering verwenden?

Das Rendering ist derzeit in Sitecore auf "Cachable", "VaryByData" und "VaryByParm" eingestellt.

ich eine Ausgabe-Cache-Attribut auf meine Aktion hinzugefügt haben, und legen Sie eine benutzerdefinierte variieren string:

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

Meine Global.asax erbt von Sitecore.Web.Application, und ich habe GetVaryByCustomString außer Kraft gesetzt wie folgt :

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

ich das GetVaryByCustomString Methode Feuer nie zu sehen bin, und der Controller verhält, als ob es nicht einen Output Attribut ihm überhaupt hat ... es ist, als ob es den Standard tun "gerade tatsächlich ist Cachable "," VaryByData "," VaryByParm "Verhalten von Si tecore.

Irgendwelche Hinweise?

Antwort

10

Ok, hier ist, wie ich es gemacht habe.

Ich habe ein Kontrollkästchenfeld auf /sitecore/templates/System/Layout/Sections/Caching namens "VaryByMyCustomThing" hinzugefügt.

Dann ersetzte ich die Pipeline "GenerateCacheKey" in der Sitecore.Mvc.config mit einer benutzerdefinierten Implementierung. Ich ersetzte dies:

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

mit diesem:

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

Meine GenerateCustomCacheKey Klasse sieht wie folgt aus:

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"]; 
     } 
    } 
} 
Verwandte Themen