2012-01-31 69 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

相关问题