From abfe7a022ee2a785ee721b81c93e7d8a7a9142c9 Mon Sep 17 00:00:00 2001 From: Matteo Piovanelli Date: Thu, 5 Dec 2019 21:10:18 +0100 Subject: [PATCH] caching sitecultureselector and sslsettingspart (#8289) --- .../Handlers/SslSettingsPartHandler.cs | 19 ++++++++++++- ...rictTransportSecurityMiddlewareProvider.cs | 19 +++++++++++-- .../Services/SiteCultureSelector.cs | 28 ++++++++++++++----- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.SecureSocketsLayer/Handlers/SslSettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.SecureSocketsLayer/Handlers/SslSettingsPartHandler.cs index 8d9e08d07..ab93bdd4b 100644 --- a/src/Orchard.Web/Modules/Orchard.SecureSocketsLayer/Handlers/SslSettingsPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.SecureSocketsLayer/Handlers/SslSettingsPartHandler.cs @@ -3,12 +3,24 @@ using Orchard.Data; using Orchard.ContentManagement.Handlers; using Orchard.Localization; using Orchard.SecureSocketsLayer.Models; +using Orchard.Caching; namespace Orchard.SecureSocketsLayer.Handlers { public class SslSettingsPartHandler : ContentHandler { - public SslSettingsPartHandler() { + private readonly ISignals _signals; + + public SslSettingsPartHandler(ISignals signals) { + + _signals = signals; + T = NullLocalizer.Instance; + Filters.Add(new ActivatingFilter("Site")); + + // Evict cached content when updated, removed or destroyed. + OnPublished((context, part) => Invalidate(part)); + OnRemoved((context, part) => Invalidate(part)); + OnDestroyed((context, part) => Invalidate(part)); } public Localizer T { get; set; } @@ -22,5 +34,10 @@ namespace Orchard.SecureSocketsLayer.Handlers { Position = "2" }); } + + private void Invalidate(SslSettingsPart content) { + _signals.Trigger($"SslSettingsPart_{content.Id}"); + _signals.Trigger("SslSettingsPart_EvictAll"); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.SecureSocketsLayer/Services/StrictTransportSecurityMiddlewareProvider.cs b/src/Orchard.Web/Modules/Orchard.SecureSocketsLayer/Services/StrictTransportSecurityMiddlewareProvider.cs index 2b3d8c329..3e46e2c6d 100644 --- a/src/Orchard.Web/Modules/Orchard.SecureSocketsLayer/Services/StrictTransportSecurityMiddlewareProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.SecureSocketsLayer/Services/StrictTransportSecurityMiddlewareProvider.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Orchard.Caching; using Orchard.ContentManagement; using Orchard.Logging; using Orchard.Owin; @@ -8,11 +9,19 @@ using Owin; namespace Orchard.SecureSocketsLayer.Services { public class StrictTransportSecurityMiddlewareProvider : IOwinMiddlewareProvider { private readonly IWorkContextAccessor _wca; + private readonly ICacheManager _cacheManager; + private readonly ISignals _signals; public ILogger Logger { get; set; } - public StrictTransportSecurityMiddlewareProvider(IWorkContextAccessor wca) { + public StrictTransportSecurityMiddlewareProvider( + IWorkContextAccessor wca, + ICacheManager cacheManager, + ISignals signals) { + _wca = wca; + _cacheManager = cacheManager; + _signals = signals; Logger = NullLogger.Instance; } @@ -22,7 +31,13 @@ namespace Orchard.SecureSocketsLayer.Services { new OwinMiddlewareRegistration { Configure = app => app.Use(async (context, next) => { - var sslSettings = _wca.GetContext().CurrentSite.As(); + var cacheKey = "Orchard.SecureSocketsLayer.Services.StrictTransportSecurityMiddlewareProvider.GetOwinMiddlewares"; + var sslSettings = _cacheManager.Get(cacheKey, true, ctx =>{ + // check whether the cache should be invalidated + ctx.Monitor(_signals.When("SslSettingsPart_EvictAll")); + // cache this and save recomputing it each call + return _wca.GetContext().CurrentSite.As(); + }); if (sslSettings.SendStrictTransportSecurityHeaders) { string responseValue = "max-age=" + sslSettings.StrictTransportSecurityMaxAge; diff --git a/src/Orchard/Localization/Services/SiteCultureSelector.cs b/src/Orchard/Localization/Services/SiteCultureSelector.cs index 66be0e6ec..dcfcbc751 100644 --- a/src/Orchard/Localization/Services/SiteCultureSelector.cs +++ b/src/Orchard/Localization/Services/SiteCultureSelector.cs @@ -1,22 +1,36 @@ using System; using System.Web; +using Orchard.Caching; namespace Orchard.Localization.Services { public class SiteCultureSelector : ICultureSelector { private readonly IWorkContextAccessor _workContextAccessor; + private readonly ICacheManager _cacheManager; + private readonly ISignals _signals; + + public SiteCultureSelector( + IWorkContextAccessor workContextAccessor, + ICacheManager cacheManager, + ISignals signals) { - public SiteCultureSelector(IWorkContextAccessor workContextAccessor) { _workContextAccessor = workContextAccessor; + _cacheManager = cacheManager; + _signals = signals; } public CultureSelectorResult GetCulture(HttpContextBase context) { - string currentCultureName = _workContextAccessor.GetContext().CurrentSite.SiteCulture; + var cacheKey = "Orchard.Localization.Services.SiteCultureSelector.GetCulture"; + return _cacheManager.Get(cacheKey, true, ctx => { + // this is the same signal used in Orchard.Framework.DefaultCultureManager + ctx.Monitor(_signals.When("culturesChanged")); - if (String.IsNullOrEmpty(currentCultureName)) { - return null; - } - - return new CultureSelectorResult { Priority = -5, CultureName = currentCultureName }; + string currentCultureName = _workContextAccessor.GetContext().CurrentSite.SiteCulture; + if (String.IsNullOrEmpty(currentCultureName)) { + return null; + } + return new CultureSelectorResult { Priority = -5, CultureName = currentCultureName }; + }); + } } }