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

C# 如何在asp.net mvc3中使用缓存?,c#,asp.net-mvc-3,caching,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)

我的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]
为空

我做错了什么


任何帮助都将不胜感激。

使用HttpRuntime.Cache怎么样,这个示例将缓存一小时

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

使用HttpRuntime.Cache怎么样,这个示例将缓存一个小时

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

您在任何时候都没有给
缓存
一个值。。。请注意,如果您希望将常规web缓存分开,那么它可能不是您的最佳选择;或许

MemoryCache cache = new MemoryCache(); 

您在任何时候都没有给
缓存
一个值。。。请注意,如果您希望将常规web缓存分开,那么它可能不是您的最佳选择;或许

MemoryCache cache = new MemoryCache(); 

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

学校设置=CacheProviderFactory.Cache.Get(“学校设置”)为(学校)


请注意,我使用的是“as”,而不是投射对象。如果值为null,Cast将爆炸,而“as”只会给您一个null值,这是您所期望的

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

学校设置=CacheProviderFactory.Cache.Get(“学校设置”)为(学校)


请注意,我使用的是“as”,而不是投射对象。如果值为null,Cast将爆炸,而“as”只会给您一个null值,这是您所期望的

请尝试以下代码。它对我的项目很有效

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

请尝试以下代码。它对我的项目很有效

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


您是否检查了MVC3的输出缓存?顺便说一句,Siema!维塔姆:)我需要这样使用缓存。你打算在某个时候给
缓存
赋值吗因为您没有。另外,您声称
cache
是一个单例,并且存在一个
CacheProviderFactory.cache
——这些东西都没有显示在代码中。你让我们猜测你移除了什么;这不会导致一个好的答案…稍微偏离主题,但您可能想看看如何使用依赖项注入来提供缓存实例。这样,如果需要,您可以将其更改为另一个缓存提供程序,并且还可以更轻松地进行单元测试。您是否检查了MVC3的输出缓存?顺便说一句,Siema!维塔姆:)我需要这样使用缓存。你打算在某个时候给
缓存
赋值吗因为您没有。另外,您声称
cache
是一个单例,并且存在一个
CacheProviderFactory.cache
——这些东西都没有显示在代码中。你让我们猜测你移除了什么;这不会导致一个好的答案…稍微偏离主题,但您可能想看看如何使用依赖项注入来提供缓存实例。这样,如果需要,您可以将其更改为另一个缓存提供程序,也可以更轻松地进行单元测试。我需要使用
System.Web.caching
@MateuszRogulski为什么?这是一个私有的实现细节;坦白地说,它不应该是如何实现的。好吧,我已经用你的方法改变了它。谢谢:)我需要使用
System.Web.Caching
@MateuszRogulski为什么?这是一个私有的实现细节;坦白地说,它不应该是如何实现的。好吧,我已经用你的方法改变了它。谢谢:)就像Marc Grassed提到的,你确定在调用Get方法时缓存不为null吗?就像Marc Grassed提到的,你确定在调用Get方法时缓存不为null吗?我也有同样的问题-null引用问题。但是我把它改成了
HttpRuntime.Cache
我也遇到了同样的问题-空引用的问题。但我已将其更改为
HttpRuntime.Cache