public async Task <dynamic> GetAllKnownWidgetZonesAsync() { var fileName = "widgetzones.json"; var fs = _appContext.AppDataRoot; var cacheKey = CommonHelper.BuildScopedKey(fileName); var rawJson = await _memoryCache.GetOrCreateAsync(cacheKey, async entry => { if (fs.FileExists(fileName)) { entry.ExpirationTokens.Add(fs.Watch(fileName)); return(await fs.ReadAllTextAsync(fileName)); } else { return(string.Empty); } }); if (rawJson is string json && json.HasValue()) { try { return(JObject.Parse(json)); } catch { // Json is invalid. Don't parse again. _memoryCache.Set(cacheKey, string.Empty); } } return(null); }