public string CreateKeyFragment(HtmlHelper htmlHelper, IContent content, ICacheableSettings cacheableSettings) { var user = htmlHelper.ViewContext?.HttpContext?.User; if (cacheableSettings.Parameters.TryGetValue(SupportedVaryBy, out string value) && user != null) { var parameters = value.Split(',').Select(p => p.Trim()); if (parameters.FirstOrDefault() == "*") { return(string.Join(",", GetActiveRoles(VisitorGroupRepository.List().Select(vg => vg.Name)))); } return(string.Join(",", GetActiveRoles(parameters))); } return(string.Empty); IEnumerable <string> GetActiveRoles(IEnumerable <string> roles) { foreach (var role in roles.Where(r => VisitorGroupService.IsUserInVisitorGroup(user, r, htmlHelper.ViewContext.HttpContext))) { yield return(role); } } }
public string CreateKeyFragment(HtmlHelper htmlHelper, IContent content, ICacheableSettings cacheableSettings) { var query = htmlHelper.ViewContext?.HttpContext?.Request?.QueryString; if (cacheableSettings.Parameters.TryGetValue(SupportedVaryBy, out string value) && query != null) { var parameters = value.Split(',').Select(p => p.Trim()); if (parameters.FirstOrDefault() == "*") { return(string.Join(",", GetQueryParameters(query.AllKeys))); } return(string.Join(",", GetQueryParameters(parameters))); } return(string.Empty); IEnumerable <string> GetQueryParameters(IEnumerable <string> keys) { foreach (var key in keys) { yield return($"{key}:{query.Get(key)}"); } } }
public string GenerateCacheKey(ICacheableSettings cacheableSettings, HtmlHelper helper, IContent content) { return(string.Join("&", CreateKeyFragments())); IEnumerable <string> CreateKeyFragments() { yield return("rootKey=" + ContentCacheKeyCreator.CreateLanguageCacheKey(content.ContentLink, (content as ILocalizable)?.Language.Name)); foreach (string varyBy in cacheableSettings.VaryBy.OrderBy(v => v, StringComparer.OrdinalIgnoreCase)) { if (_keyFragmentFactories.TryGetValue(varyBy, out var factory)) { yield return(factory.SupportedVaryBy + "=" + factory.CreateKeyFragment(helper, content, cacheableSettings)); } } } }
public void CreateKeyFragment_GenerateKeyFragmentFromAllVisitorGroup_ReturnStringWithAllVisitorGroupValue(IContent content, ICacheableSettings cacheableSettings, IViewDataContainer viewDataContainer, [Frozen] IVisitorGroupService visitorGroupService, [Frozen] IVisitorGroupRepository visitorGroupRepository, [Frozen] IEnumerable <VisitorGroup> visitorGroups, VisitorGroupKeyFragmentFactory visitorGroupKeyFragmentFactory) { var htmlHelper = new HtmlHelper(A.Fake <ViewContext>(), viewDataContainer); A.CallTo(() => visitorGroupRepository.List()).Returns(visitorGroups); A.CallTo(visitorGroupService) .Where(call => call.Method.Name == "IsUserInVisitorGroup" && visitorGroups.Any(vg => vg.Name == (call.Arguments.ElementAtOrDefault(1) as string))) .WithReturnType <bool>() .Returns(true); A.CallTo(() => cacheableSettings.VaryBy).Returns(new[] { VaryBy.VisitorGroups }); A.CallTo(() => cacheableSettings.Parameters).Returns(new Dictionary <string, string> { { VaryBy.VisitorGroups, "*" } }); string expectedResult = string.Join(",", visitorGroups.Select(vg => vg.Name)); visitorGroupKeyFragmentFactory.CreateKeyFragment(htmlHelper, content, cacheableSettings).Should().Be(expectedResult, "Because the returned value should be the all the visitor groups role names"); }
public void CreateKeyFragment_GenerateKeyFragmentFromSpecificQueryParameter_ReturnStringWithQueryParameterValue(IContent content, ICacheableSettings cacheableSettings, IEnumerable <(string name, string value)> queryParameters, IViewDataContainer viewDataContainer)
public bool TryGetSettingsFromContentData(IContentData contentData, out ICacheableSettings cacheableSettings) { if (contentData is ICacheableSettings settings && settings.IsCacheSettingEnabled) { cacheableSettings = settings; }
public void CreateKeyFragment_GenerateKeyFragmentFromUrl_ReturnStringWithUrlValue(IContent content, ICacheableSettings cacheableSettings, Uri url, IViewDataContainer viewDataContainer) { var htmlHelper = new HtmlHelper(A.Fake <ViewContext>(), viewDataContainer); A.CallTo(() => htmlHelper.ViewContext.HttpContext.Request.Url).Returns(url); A.CallTo(() => cacheableSettings.VaryBy).Returns(new[] { VaryBy.Url }); var urlKeyFragmentFactory = new UrlKeyFragmentFactory(); urlKeyFragmentFactory.CreateKeyFragment(htmlHelper, content, cacheableSettings).Should().Be(url.AbsoluteUri, "Because the returned value should be the absolute url"); }
public string CreateKeyFragment(HtmlHelper htmlHelper, IContent content, ICacheableSettings cacheableSettings) { return(htmlHelper.ViewContext?.HttpContext?.Request?.Url.AbsoluteUri); }
public void CreateKeyFragment_GenerateKeyFragmentFromAllCookie_ReturnStringWithCookieValue(IContent content, ICacheableSettings cacheableSettings, IEnumerable <HttpCookie> cookies, IViewDataContainer viewDataContainer) { var htmlHelper = new HtmlHelper(A.Fake <ViewContext>(), viewDataContainer); htmlHelper.AddCookies(cookies); A.CallTo(() => cacheableSettings.VaryBy).Returns(new[] { VaryBy.Cookies }); A.CallTo(() => cacheableSettings.Parameters).Returns(new Dictionary <string, string> { { VaryBy.Cookies, "*" } }); var cookieKeyFragmentFactory = new CookieKeyFragmentFactory(); var expectedResult = string.Join(",", cookies.Select(cookie => $"{cookie.Name}:{cookie.Value}")); cookieKeyFragmentFactory.CreateKeyFragment(htmlHelper, content, cacheableSettings).Should().Be(expectedResult, "Because the returned value should contain all the cookies names and values"); }
public void CreateKeyFragment_GenerateKeyFragmentFromSpecificCookie_ReturnStringWithCookieValue(IContent content, ICacheableSettings cacheableSettings, IEnumerable <HttpCookie> cookies, HttpCookie varyByCookie, IViewDataContainer viewDataContainer) { var htmlHelper = new HtmlHelper(A.Fake <ViewContext>(), viewDataContainer); htmlHelper.AddCookies(cookies, varyByCookie); A.CallTo(() => cacheableSettings.VaryBy).Returns(new[] { VaryBy.Cookies }); A.CallTo(() => cacheableSettings.Parameters).Returns(new Dictionary <string, string> { { VaryBy.Cookies, varyByCookie.Name } }); var cookieKeyFragmentFactory = new CookieKeyFragmentFactory(); cookieKeyFragmentFactory.CreateKeyFragment(htmlHelper, content, cacheableSettings).Should().Be($"{varyByCookie.Name}:{varyByCookie.Value}", "Because the returned value should be the cookie name and value"); }
/// <summary> /// Renders from the cache or adds the result to the cache. /// </summary> /// <param name="helper">The helper.</param> /// <param name="partialRequest">The partial request.</param> /// <param name="content">The content.</param> /// <param name="templateModel">The template model.</param> /// <param name="settings">The settings.</param> protected virtual void RenderFromOrAddToCache(HtmlHelper helper, PartialRequest partialRequest, IContent content, TemplateModel templateModel, ICacheableSettings settings) { string cacheKey = KeyCreator.GenerateCacheKey(settings, helper, content); if (Cache.TryGet(cacheKey, ReadStrategy.Immediate, out string cachedHtml)) { helper.ViewContext.Writer.Write(cachedHtml); } else { RenderAndAddToCache(helper, partialRequest, content, templateModel, settings, cacheKey); } }
/// <summary> /// Render the html and adds it to the cache. /// </summary> /// <param name="helper">The helper.</param> /// <param name="partialRequest">The partial request.</param> /// <param name="content">The content.</param> /// <param name="templateModel">The template model.</param> /// <param name="settings">The settings.</param> /// <param name="cacheKey">The cache key.</param> protected virtual void RenderAndAddToCache(HtmlHelper helper, PartialRequest partialRequest, IContent content, TemplateModel templateModel, ICacheableSettings settings, string cacheKey) { using (var cacheWriter = new StringWriter()) { var currentWriter = helper.ViewContext.Writer; helper.ViewContext.Writer = cacheWriter; DefaultRenderer.Render(helper, partialRequest, content, templateModel); var html = cacheWriter.ToString(); currentWriter.Write(html); helper.ViewContext.Writer = currentWriter; if (helper.ViewContext.HttpContext.Error == null) { InsertToCache(html); } } void InsertToCache(string html) { if (settings.MaxTimeInCache == TimeSpan.Zero) { Cache.Insert(cacheKey, html, new CacheEvictionPolicy(null, MasterCacheKeys)); } else { Cache.Insert(cacheKey, html, new CacheEvictionPolicy(settings.MaxTimeInCache, CacheTimeoutType.Absolute, null, MasterCacheKeys)); } } }