2012-01-31 23 views
2

我有一個非常標準的MVC3應用程序。我試圖在緩存中存儲應用程序範圍內(而不是用戶範圍)的一些數據(在本例中爲Theme對象/名稱)。在調試時(在與Visual Studio集成的開發服務器上),如果我調用SwitchTheme,我會馬上看到新的主題。在IIS7上,任何主題都被緩存,保持緩存;它不更新到新的主題。緩存在IIS7上顯示舊值,而不是在調試服務器上

編輯:一些代碼:

public static Theme CurrentTheme { get { 
     Theme currentTheme = HttpContext.Current.Cache[CURRENT_THEME] as Theme; 

     if (currentTheme == null) 
     { 
      string themeName = DEFAULT_THEME; 
      try 
      { 
       WebsiteSetting ws = WebsiteSetting.First(w => w.Key == WebsiteSetting.CURRENT_THEME); 

       if (ws != null && !string.IsNullOrEmpty(ws.Value)) 
       { 
        themeName = ws.Value; 
       } 
      } 
      catch (Exception e) 
      { 
       // DB not inited, or we're installing, or something broke. 
       // Don't panic, just use the default. 
      } 

      // Sets HttpContext.Current.Cache[CURRENT_THEME] = new themeName) 
      Theme.SwitchTo(themeName); 
      currentTheme = HttpContext.Current.Cache[CURRENT_THEME] as Theme; 

     } 

     return currentTheme; 
    } } 

public static void SwitchTo(string name) 
    { 
     HttpContext.Current.Cache.Insert(CURRENT_THEME, new Theme(name), null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30)); 

     // Persist change to the DB. 
     // But don't do this if we didn't install the application yet. 
     try 
     { 
      WebsiteSetting themeSetting = WebsiteSetting.First(w => w.Key == WebsiteSetting.CURRENT_THEME); 
      if (themeSetting != null) 
      { 
       themeSetting.Value = name; 
       themeSetting.Save(); 
      } 
      // No "else"; if it's not there, we're installing, or Health Check will take care of it. 
     } 
     catch (Exception e) 
     { 
      // DB not inited or install not complete. No worries, mate. 
     } 
    } 

我不知道問題出在哪裏。我正在調用相同的方法並更新緩存;但IIS7只是向我展示了舊版本。

我可以在IIS中禁用輸出緩存,但這不是我想要做的。這看起來似乎是一個很好的解決辦法。

+0

您需要張貼代碼示例。 – 2012-01-31 19:44:49

+0

您是否在系統事件日誌中獲取應用程序池重置? (另外,您是否配置了IIS以將應用池重置記錄到事件日誌中)我曾經遇到過這個問題,這是因爲我們配置了虛擬內存限制太低。因此,每個請求都會重置會清空我的靜態對象的應用程序池。 – 2012-01-31 19:57:14

+0

@Ek0nomik什麼樣的代碼?我可以展示很多東西。 web.config文件? – ashes999 2012-01-31 19:59:37

回答

0

鑑於這種情況只發生在IIS7上,當輸出緩存沒有被禁用時,這似乎很可能是一個IIS7錯誤。認真。

無論是否與解決方案無關。你需要做的是找到一些使緩存失效的手動過程,比如觸摸web.config文件。

但要小心:這樣做會消除緩存(正如您所期望的),但也包括所有靜態變量(作爲副作用)。不管這是不是另一個bug,我都不知道;但就我而言,這足以解決問題。

1

沒有代碼示例很難知道你的問題是什麼。在試圖提供一些幫助,這裏是如何我經常設置在我的應用程序緩存:

public static void SetCache(string key, object value) { 
     if (value != null) { 
      HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30)); 
     } 
    } 
+0

我已經添加了一個代碼示例。 – ashes999 2012-01-31 20:05:37

+0

@ EkOnomic它在評論中提到。 – ashes999 2012-01-31 20:10:32

+0

我得到緩存的結果。調用SwitchTheme(...)向我展示了IIS中的舊(緩存)主題,而不是新主題,儘管我按照您的建議設置了該值。 – ashes999 2012-01-31 20:16:28

1

,如果你這樣做手工或應用程序域(或應用程序池)重置無論HTTP緩存僅重置原因。你確定這種情況沒有發生?一般來說,在相同的情況下,任何全局靜態變量也會保存在內存中。

有很多原因可能導致應用程序池在任何給定位置重置,例如更改爲web.config文件等。我建議檢查一下您的情況沒有發生。

順便說一下,輸出緩存是一回事,儘管它在內存中的保存方式基本相同。

+0

+1 Web.config更改確實是罪魁禍首。 – ashes999 2012-01-31 20:16:38

+0

有關IIS緩存問題的任何線索? – ashes999 2012-01-31 20:44:08

+0

從未使用的主題,所以不,對不起。但是,如果您關閉了IIS緩存,那麼這可能是瀏覽器的錯;你需要修改你的應用的輸出緩存參數來強制瀏覽器停止這樣做。 – kprobst 2012-01-31 21:08:30

相關問題