如何在asp.net mvc3中使用缓存?

时间:2012-08-07 12:50:33

标签: c# asp.net-mvc-3 caching

我的asp.net mvc3应用程序中的缓存有问题。

我的代码

using System.Web.Caching;
...
class RegularCacheProvider : ICacheProvider
{
    Cache cache ;

    public object Get(string name)
    {
        return cache[name];
    }

    public void Set(string name, object value)
    {
        cache.Insert(name, value);
    }

    public void Unset(string name)
    {
        cache.Remove(name);
    }
}

我使用singleton为它赋予价值:

School schoolSettings = (School)CacheProviderFactory.Cache.Get("SchoolSettings");
            if (schoolSettings == null)
            {
                CacheProviderFactory.Cache.Set("SchoolSettings", someObject);
            }

因此,在第一次使用时它不起作用并且给我一个错误cache[name]为空。

我做错了什么?

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:2)

在任何时候你都没有给cache一个值...并注意常规网络缓存可能不是你最好的选择,如果你想要它分开;也许

MemoryCache cache = new MemoryCache(); 

答案 1 :(得分:1)

使用HttpRuntime.Cache怎么样,这个例子会缓存一小时?

HttpRuntime.Cache.Add("SchoolSettings", someObject, null, DateTime.Now.AddHours(1),
                       System.Web.Caching.Cache.NoSlidingExpiration,
                       System.Web.Caching.CacheItemPriority.Normal, null);

答案 2 :(得分:1)

尝试以下代码。它适用于我的项目

 using System.Runtime.Caching;

    public class RegularCacheProvider : ICacheProvider
        {
            private ObjectCache Cache { get { return MemoryCache.Default; } }

            object ICacheProvider.Get(string key)
            {
                return Cache[key];
            }

            void ICacheProvider.Set(string key, object data, int cacheTime = 30)
            {
                var policy = new CacheItemPolicy {AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime)};
                Cache.Add(new CacheItem(key, data), policy);
            }

            void ICacheProvider.Unset(string key)
            {
                Cache.Remove(key);
            }
        }

答案 3 :(得分:0)

更改检查值的代码,如下所示:

  

School schoolSettings = CacheProviderFactory.Cache.Get(“SchoolSettings”)as(School);

请注意,我使用“as”而不是强制转换对象。如果值为null,则Cast会爆炸,而“as”只会为您提供一个您想要的空值。