C#HttpRuntime.Cache

时间:2013-03-27 16:12:01

标签: c# iis-7.5

我在Win7 64位上。这是一个相当令人讨厌的问题。以下是重现它的步骤:

  1. 在Visual Studio中创建一个新的C#Asp.Net项目(我使用VS 2010,不确定这是否重要)

  2. 在Default.aspx的代码中,将此代码添加到Page_Load方法

    HttpRuntime.Cache.Insert("foo", "test", null, DateTime.Now.AddMinutes(30), TimeSpan.FromMinutes(0));
    
    string p = "var retval; retval = window.showModalDialog('Test.aspx','', 'dialogHeight:100px; dialogWidth: 100px;scroll: no;center: Yes; help: No; resizable: yes; status: no; unadorned: yes;');";
    ScriptManager.RegisterStartupScript(this, GetType(), "openpop", p, true);
    
  3. 添加另一个名为Test.aspx的Web表单。你可以在标记中放置任何你想要的东西,这并不重要。

  4. 在Test.aspx背后的代码中,将此行放在Page_Load方法中,并在其上设置断点。

    string x = (string)HttpRuntime.Cache["foo"];
    
  5. 在项目属性中,确保将应用程序设置为使用本地IIS Web服务器运行。

  6. 当你运行项目并且它到达断点时,再一步让它分配x,然后x的值将为null。至少那就是发生在我身上的事情。我不明白为什么会发生这种情况,因为值仍然应该在缓存中。在我的实际应用程序中,我还添加了一个回调到HttpRuntime.Cache.Insert来跟踪项目不在缓存中的原因,并且它说它已经过期了。但如果我给它一个30分钟的绝对到期时间窗口,它怎么能过期?

    有趣的是,如果使用Visual Studio Development Server而不是IIS运行应用程序,则该值将存在于缓存中!

1 个答案:

答案 0 :(得分:4)

我对此类设置没有任何问题,但您确实如此。所以我认为问题出在DateTime.Now设置中。根据msdn:

  

插入对象到期并从缓存中删除的时间。为避免当地时间可能出现的问题,例如从标准时间更改为夏令时,请使用 UtcNow 而非现在作为此参数值。如果使用绝对过期,则slidingExpiration参数必须为NoSlidingExpiration。

所以试试这个:

HttpRuntime.Cache.Insert("foo", "test", null, DateTime.UtcNow.AddMinutes(30), TimeSpan.FromMinutes(0));