Adding HtmlCache Viewing Feature to Sitecore.Rocks Visual Studio Extension.

sitecore-rocks-header-image

After writing an article about viewing Sitecore HTML cache, I thought that it is not convenient to move custom code from one project to another. When, instead, there is ability to extend widely used existing Sitecore development tool Sitecore.Rocks then it should be done. I decided to contribute into it.

First of all, you need to fork Sitecore.Rocks project on GitHub.

Sitecore.Rocks works like server-client application. You have server side (Sitecore.Rocks.Server, connector in other words) that is copied to all Sitecore websites and client side: interface in Visual Studio to display different things from Sitecore. Fortunately, there is already “Data” column for cache viewer to display cache details and we don’t need to modify interface to add something new. But this column shows only path to item, when cache key is Sitecore identifier. In all other cases Data column will be empty. Let’s extend amount of data that could be shown in this column.

Logic that returns data to be displayed in this table located in /src/Sitecore.Rocks.Server/Requests/Caches/GetCacheKeys.cs file. We can modify it and add ability to return cache value when cache type is string or id:

 

using System;

using System.Collections;

using System.Collections.Concurrent;

using System.IO;

using System.Reflection;

using System.Xml;

using Sitecore.Caching;

using Sitecore.Caching.Generics;

using Sitecore.Configuration;

using Sitecore.Data;

using Sitecore.Diagnostics;

using Sitecore.Extensions.StringExtensions;

namespace Sitecore.Rocks.Server.Requests.Caches

{

public class GetCacheKeys

{

[NotNull]

public string Execute([NotNull] string cacheName)

{

Assert.ArgumentNotNull(cacheName, nameof(cacheName));

var writer = new StringWriter();

var output = new XmlTextWriter(writer)

{

Formatting = Formatting.Indented,

Indentation = 2

};

output.WriteStartElement("cacheKeys");

var cache = CacheManager.GetNamedInstance(cacheName, 0, false);

if (cache != null)

{

Write(output, cache);

}

output.WriteEndElement();

return writer.ToString();

}

private void Write([NotNull] XmlTextWriter output, [NotNull] ICache cache)

{

Debug.ArgumentNotNull(output, nameof(output));

Debug.ArgumentNotNull(cache, nameof(cache));

Database database = null;

var n = cache.Name.IndexOf("[", StringComparison.Ordinal);

if (n >= 0)

{

var databaseName = cache.Name.Left(n);

try

{

database = Factory.GetDatabase(databaseName);

}

catch

{

database = null;

}

}

//MethodInfo to gets the entry represented by key

//Parameter: The cache key

//Returns: the entry (or null)

//public ICacheEntry GetEntry(TKey key)

var getEntryMethod = typeof(Cache).GetMethod("GetEntry", new Type[] {typeof(string)});

foreach (var cacheKey in cache.GetCacheKeys())

{

output.WriteStartElement("key");

output.WriteAttributeString("key", cacheKey.ToString());

output.WriteAttributeString("size", string.Empty);

output.WriteAttributeString("lastAccessed", string.Empty);

var pathValue = string.Empty;

if (database != null)

{

pathValue = GetDbPathValue(database, cacheKey);

}

if (!String.IsNullOrEmpty(pathValue))

{

output.WriteValue(pathValue);

}

else

{

try

{

var cacheEntry = getEntryMethod.Invoke(cache, new[] {cacheKey});

var cacheValue = cacheEntry.GetType().GetProperty("Data").GetValue(cacheEntry);

var cacheType = cacheEntry.GetType().GetProperty("Data").GetValue(cacheEntry).GetType();

if (cacheType == typeof(string))

{

output.WriteValue(cacheValue);

}

if (cacheType == typeof(ID))

{

output.WriteValue(cacheValue.ToString());

}

catch (Exception ex)

{

Sitecore.Diagnostics.Log.Error("Could not get values for cache: "+ cache.Name, ex);

}

}

output.WriteEndElement();

}

}

///

 

/// Returns path if key is ID and empty string if it is not

///

 

/// Database where item is located

/// Cache key, that could be ID

///

private string GetDbPathValue([NotNull] Database database, [NotNull] object key)

{

Debug.ArgumentNotNull(database, nameof(database));

Debug.ArgumentNotNull(key, nameof(key));

var id = key.ToString().Left(Constants.GuidLength);

if (!ID.IsID(id))

{

return string.Empty;

}

var item = database.GetItem(id);

if (item != null)

{

return item.Paths.Path;

}

return string.Empty;

}

}

}

view raw GetCacheKeys.cs hosted by GitHub

After building a solution, we need copy Sitecore.Rocks.Server.dll to bin folder of our website. Now, you are able to see what it inside cache. If you are interested in viewing other types of cache(not only string and id) then you are able to extend code above with your needs.



sitecore-rocks2

If my pull request is accepted, then this feature will be available in one of next Sitecore.Rocks version.

want to speak to one of our experts?

Anton Tishchenko Thumbnail
Anton Tishchenko
Head of Digital Engineering
Anton has worked as a developer since 2007, he is a highly experienced Sitecore developer who previously worked as a Technical Team Lead at Sitecore. Anton's expertise in the Sitecore platform is formidable; he's definitely one of the world's finest Sitecore ninjas and in 2019 he was recognised as the only Sitecore MVP in the Ukraine when he achieved his Technology MVP Status.
Anton Tishchenko Thumbnail

Anton Tishchenko

29 May 2018 - 8 minute read
share this

stay in the know, stay ahead.

Get the latest from the agency, including news, events and expert content.
explore services in the article
find out what we can do for you
read some of our case studies