2012-08-07 59 views
0

我在我的asp.net mvc3應用程序中有緩存問題。如何在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); 
    } 
} 

我使用單爲給定值,因爲它:

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

所以在第一次使用它不工作,並給我一個錯誤cache[name]爲空。

我在做什麼錯了?

任何幫助,將不勝感激。

+0

您是否檢查了MVC3的輸出緩存? BTW Siema! – 2012-08-07 12:53:15

+0

Witam :)我需要使用Cache這種方式。 – 2012-08-07 12:54:27

+0

您是否計劃在某個時刻爲'cache'指定一個值? '因爲你沒有。 – 2012-08-07 12:58:08

回答

1

如何使用HttpRuntime.Cache,這個例子會緩存一個小時?

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

我需要使用'System.Web.Caching' – 2012-08-07 12:57:47

+1

@MateuszRogulski爲什麼?這是一個私人實施細節;坦率地說,它不應該*重要*如何實施 – 2012-08-07 13:02:09

+0

好吧,我已經改變了你的方法。謝謝:) – 2012-08-07 18:58:03

2

在任何時候你給cache價值......並注意定期網絡緩存可能不是你最好的選擇,如果你想要獨立;也許

MemoryCache cache = new MemoryCache(); 
+0

它仍然不起作用。 – 2012-08-07 13:05:31

+0

@MateuszRogulski定義「不工作」 – 2012-08-07 14:57:06

+0

我有同樣的問題 - 與空引用的問題。但我已經改變它'HttpRuntime.Cache' – 2012-08-07 19:00:55

0

變化,你檢查的數值如下代碼:

學校schoolSettings = CacheProviderFactory.Cache.Get( 「SchoolSettings」)爲(學校);

請注意,我使用「as」而不是投射物體。如果值爲空,演員將爆炸,而「as」只會給你一個你期望的空值。

+0

我有一個Get方法的錯誤,所以它也給出了異常。 – 2012-08-07 13:03:56

+0

像Marc Gravel提到的那樣,Get方法被調用時,你確定緩存是否爲空? – 2012-08-07 13:06:32

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