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); } }