string TryGetFromCache(string query, Func <string> retrieveRemoteContent)
        {
            var contentByteArray = System.Text.Encoding.Unicode.GetBytes(query);

            using (var sha256 = System.Security.Cryptography.SHA256.Create())
            {
                var cacheKey       = sha256.ComputeHash(contentByteArray);
                var cacheKeyBase64 = new string(cacheKey.Select(@byte => @byte.ToString("X")[0]).ToArray());
                if (File.Exists(cacheKeyBase64))
                {
                    return(File.ReadAllText(cacheKeyBase64));
                }

                var metrics         = new MetricsCollector();
                var newContent      = metrics.LogAndInvoke(() => retrieveRemoteContent(), "retrieveRemoteContent");
                var contentWithMeta = $"{{\"query\":{query},\"retrieveDuration\":{(metrics as IEnumerable<Metrics>).Single().Duration.TotalMilliseconds},"
                                      + newContent.Substring(1);
                File.WriteAllText(cacheKeyBase64, contentWithMeta);
                return(newContent);
            }
        }