public override object Get(string key)
    {
        LogAction("Get", string.Format("Key: {0}", key));

        DiskOutputCacheItem item = null;

        CacheItems.TryGetValue(key, out item);

        // Was the item found?
        if (item == null)
        {
            return(null);
        }

        // Has the item expired?
        if (item.UtcExpiry < DateTime.UtcNow)
        {
            // Item has expired
            this.Remove(key);

            return(null);
        }

        return(GetCacheData(item));
    }
    protected virtual void RemoveCacheData(DiskOutputCacheItem item)
    {
        var fileToRetrieve = Path.Combine(this.CacheFolder, item.FileName);

        if (File.Exists(fileToRetrieve))
        {
            File.Delete(fileToRetrieve);
        }
    }
    protected virtual void WriteCacheData(DiskOutputCacheItem item, object entry)
    {
        var fileToWrite = Path.Combine(this.CacheFolder, item.FileName);

        var formatter = new BinaryFormatter();

        using (var stream = new FileStream(fileToWrite, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
        {
            formatter.Serialize(stream, entry);
        }
    }
    protected virtual object GetCacheData(DiskOutputCacheItem item)
    {
        var fileToRetrieve = Path.Combine(this.CacheFolder, item.FileName);

        if (File.Exists(fileToRetrieve))
        {
            var formatter = new BinaryFormatter();
            using (var stream = new FileStream(fileToRetrieve, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                return(formatter.Deserialize(stream));
            }
        }
        else
        {
            // Eep, could not find the file!
            return(null);
        }
    }
    public override void Remove(string key)
    {
        LogAction("Remove", string.Format("Key: {0}", key));

        DiskOutputCacheItem item = null;

        this.CacheItems.TryGetValue(key, out item);

        if (item != null)
        {
            // Attempt to delete the cached content on disk and then remove the item from CacheItems...
            // If there is a problem, fail silently
            try
            {
                RemoveCacheData(item);

                CacheItems.Remove(key);
            }
            catch {}
        }
    }
    public override void Set(string key, object entry, DateTime utcExpiry)
    {
        LogAction("Set", string.Format("Key: {0} | UtcExpiry: {1}", key, utcExpiry.ToString()));

        // Create a DiskOutputCacheItem object
        var item = new DiskOutputCacheItem(this.GetSafeFileName(key), utcExpiry);

        WriteCacheData(item, entry);

        // Add item to CacheItems, if needed, or update the existing key, if it already exists
        lock (_lockObject)
        {
            if (this.CacheItems.ContainsKey(key))
            {
                this.CacheItems[key] = item;
            }
            else
            {
                this.CacheItems.Add(key, item);
            }
        }
    }