0

我在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 服务器运行。

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

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

4

1 回答 1

4

我对这种设置没有任何问题,但你有。所以我认为问题在于DateTime.Now设置你的使用。根据msdn:

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

所以试试这个:

HttpRuntime.Cache.Insert("foo", "test", null, DateTime.UtcNow.AddMinutes(30), TimeSpan.FromMinutes(0));
于 2013-03-28T08:21:33.037 回答