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