So wenden Sie den Ausgabe-Cache auf Optimizely CMS 12 an

Einführen

Optimizely CMS 12 ist eine Plattform für Content-Management-Systeme. Es wird von .NET 6.0 geschrieben. Tatsächlich ist das Output-Caching-Konzept noch nicht in .NET 6.0 angekommen, aber es gibt ein Response-Caching-Konzept in .NET6.0.

Sie können den Antwortcache verwenden, um die Ausgabe für MVC-Controller, MVC-Aktionsmethoden und RAZOR-Seiten zwischenzuspeichern. Response Caching reduziert den Arbeitsaufwand, den der Webserver zum Generieren einer Antwort durchführt, indem das Ergebnis sofort aus dem Cache zurückgegeben wird, falls es vorhanden ist, anstatt Methoden immer wieder auszuführen. Dadurch wird die Performance verbessert und die Serverressourcen optimiert.

Schritt zum Anwenden des Antwort-Cache in Optimizely CMS 12

  • Schritt 1: Hinzufügen [ResponseCache] Attribut für die gewünschte Controller-/Aktions-/Rasiermesserseite:
    public class StartPageController : PageControllerBase
    {
        [ResponseCache(Duration =30, Location = ResponseCacheLocation.Any)]
        public IActionResult Index(StartPage currentPage)
        {
            var model = PageViewModel.Create(currentPage);

            // Check if it is the StartPage or just a page of the StartPage type.
            if (SiteDefinition.Current.StartPage.CompareToIgnoreWorkID(currentPage.ContentLink))
            {
                // Connect the view models logotype property to the start page's to make it editable
                var editHints = ViewData.GetEditHints, StartPage>();
               editHints.AddConnection(m => m.Layout.Logotype, p => p.SiteLogotype);
               editHints.AddConnection(m => m.Layout.ProductPages, p => p.ProductPageLinks);
               editHints.AddConnection(m => m.Layout.CompanyInformationPages, p => p.CompanyInformationPageLinks);
               editHints.AddConnection(m => m.Layout.NewsPages, p => p.NewsPageLinks);
               editHints.AddConnection(m => m.Layout.CustomerZonePages, p => p.CustomerZonePageLinks);
           }

           return View(model);
       }
   }

Dauer=30 wird die Seite für 30 Sekunden zwischenspeichern

Location=ResponseCacheLocation.Any wird die Seite sowohl in Proxys als auch im Client zwischenspeichern.

Wenn Sie für bestimmte Situationen keinen Antwortcache anwenden, können Sie ihn verwenden Location= ResponseCacheLocation.None Und NoStore=true

  • Schritt 2: Response Cache Middleware-Dienste zur Dienstsammlung mit AddResponseCaching-Erweiterungsmethode hinzufügen:
    public void ConfigureServices(IServiceCollection services)
    {
        if (_webHostingEnvironment.IsDevelopment())
        {
            AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(_webHostingEnvironment.ContentRootPath, "App_Data"));

            services.Configure(options => options.Enabled = false);
        }

        services
            .AddCmsAspNetIdentity()
            .AddCms()
            .AddCmsTagHelpers()
            .AddAlloy()
            .AddAdminUserRegistration()
            .AddEmbeddedLocalization();

        // Required by Wangkanai.Detection
        services.AddDetection();

        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
        });
        services.AddControllers();
        services.AddResponseCaching();
    }
  • Schritt 3: Konfigurieren Sie die App für die Verwendung der Middleware mit der UseResponseCaching-Erweiterungsmethode:
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        // Required by Wangkanai.Detection
        app.UseDetection();
        app.UseSession();

        app.UseResponseCaching();

        app.UseStaticFiles();
        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapContent();
            endpoints.MapControllers();
        });
    }

Bitte beachten Sie, dass beim Laden einer Seite durch Drücken der Taste F5 im Browser der Cache für diese Seite aktualisiert wird, indem der Cache-Control-Header zur Anforderung „max-age=0“ hinzugefügt wird. Um dies zu verhindern, können Sie die folgende Middleware vor der Response-Cache-Middleware hinzufügen:

   app.Use(async (context, next) =>
   {
        const string cc = "Cache-Control";

        if (context.Request.Headers.ContainsKey(cc) && string.Equals(context.Request.Headers[cc], "max-age=0", StringComparison.InvariantCultureIgnoreCase))
        {
              context.Request.Headers.Remove(cc);
        }
        await next();
   });

So deaktivieren Sie den Cache, wenn der Inhalt geändert wird

Tatsächlich verwendet die Middleware für den Antwortcache standardmäßig MemoryResponseCache, und diese Implementierung unterstützt das Löschen des Cache nicht. Sie können also schnell und schmutzig einen neuen Cache erhalten, indem Sie die Content-Cache-Version als Abfrageschlüssel zum Variieren des Cache verwenden. Die Version des Inhaltscache wird erhöht, sobald Inhalte geändert werden.

Hier sind die Schritte, die Sie dazu unternehmen können:

  • Fügen Sie ContentCacheVersion hinzu, um nach Abfrageschlüsselattribut zu variieren
   [ResponseCache(Duration =30, Location = ResponseCacheLocation.Any, VaryByQueryKeys = new string[] { "ContentCacheVersion"})]
   public IActionResult Index(StartPage currentPage)
   {
       var model = PageViewModel.Create(currentPage);
       // Check if it is the StartPage or just a page of the StartPage type.
       if (SiteDefinition.Current.StartPage.CompareToIgnoreWorkID(currentPage.ContentLink))
       {
  • Fügen Sie eine Middleware vor Response Caching Middleware hinzu, um die Inhaltscacheversion zur Abfragezeichenfolge hinzuzufügen, und fügen Sie eine Middleware nach Response Caching Middleware hinzu, um diese aus der Abfragezeichenfolge zu entfernen.
   app.Use(async (context, next) =>
        {
            var contentCacheVersion = ServiceLocator.Current.GetInstance();

            context.Request.QueryString = context.Request.QueryString.Add("ContentCacheVersion", contentCacheVersion.Version.ToString());
           
            await next();
        });

        app.UseResponseCaching();

        app.Use(async (context, next) =>
        {
            var nameValueCollection = System.Web.HttpUtility.ParseQueryString(context.Request.QueryString.ToString());
            nameValueCollection.Remove("ContentCacheVersion");
            context.Request.QueryString = new QueryString($"?{nameValueCollection}");
            
            await next();
        });

So variieren Sie den Response-Cache nach Besuchergruppe

Es ist dasselbe wie im Fall von geänderten Inhalten, Sie können schnell und schmutzig Besuchergruppen als Variationen nach Abfrageschlüssel wie folgt hinzufügen:

  • Fügen Sie VisitorGroup hinzu, um nach Abfrageschlüsselattribut zu variieren
    [ResponseCache(Duration =30, Location = ResponseCacheLocation.Any, VaryByQueryKeys = new string[] { "VisitorGroup"})]
    public IActionResult Index(StartPage currentPage)
    {
        var model = PageViewModel.Create(currentPage);

        // Check if it is the StartPage or just a page of the StartPage type.
        if (SiteDefinition.Current.StartPage.CompareToIgnoreWorkID(currentPage.ContentLink))
        {
  • Fügen Sie eine Middleware vor Response Caching Middleware hinzu, um die aktuelle Besuchergruppe zur Abfragezeichenfolge hinzuzufügen, und fügen Sie eine Middleware nach Response Caching Middleware hinzu, um sie aus der Abfragezeichenfolge zu entfernen.
   app.Use(async (context, next) =>
        {
            context.Request.QueryString = context.Request.QueryString.Add("VisitorGroup", GetCurrentVisitorGroups(context));
           
            await next();
        });
        app.UseResponseCaching();
        app.Use(async (context, next) =>
        {
            var nameValueCollection = System.Web.HttpUtility.ParseQueryString(context.Request.QueryString.ToString());
            nameValueCollection.Remove("VisitorGroup");
            context.Request.QueryString = new QueryString($"?{nameValueCollection}");
            await next();
        });
  • Fügen Sie die GetCurrentVisitorGroups-Methode hinzu, um Besuchergruppen basierend auf dem aktuellen Kontext abzurufen
    private string GetCurrentVisitorGroups(HttpContext context)
    {
        var  principalAccessor = ServiceLocator.Current.GetInstance();
        var  visitorGroupRepository = ServiceLocator.Current.GetInstance();
        var  visitorGroupRoleRepository = ServiceLocator.Current.GetInstance();

        var roleNames = visitorGroupRepository.List().Select(x => x.Name);

        var currentGroups = new List();
        foreach (var roleName in roleNames)
        {
            if (visitorGroupRoleRepository.TryGetRole(roleName, out var role))
            {
                if (role.IsMatch(principalAccessor.Principal, context))
                {
                    currentGroups.Add(roleName);
                }
            }
        }
        return string.Join("|", currentGroups);
    }

Das ist es. Mit diesem Ansatz können Sie den integrierten Antwort-Cache schnell in Optimizely CMS 12 anwenden, ohne zu viel anpassen oder Pakete von Drittanbietern verwenden zu müssen. Ein weiteres Thema zur Verwendung von Ausgabe-Caching-Paketen von Drittanbietern finden Sie hier https://www.gulla.net/en/blog/quick-and-dirty-output-cache-in-optimizely-cms12/

17. März 2023

Lesen Sie auch  María Pombo erklärt den Grund für die Bewegung, die sie während des Interviews in „El Hormiguero“ wiederholte: „Kleinigkeiten“

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.