如何以编程方式清除ASP.NET缓存?

时间:2011-03-24 16:39:07

标签: asp.net caching

在ASP.NET Webforms中,我可以使用<%@ OutputCache Duration =“3600”VaryByParam =“none”%>缓存网页。我有非常静态的数据,不经常更新,但是当它更新时,网页上的HTML将会改变。这些数据将与管理系统相关联,允许维护人员进行适当的编辑。

我想有办法将OutputCache的持续时间设置得很长。但我还希望能够在数据更新时从缓存中清除此网页(最好是从数据编辑页面)。

在ASP.NET中实现此目标的标准方法是什么?

3 个答案:

答案 0 :(得分:1)

For Each de As DictionaryEntry In HttpContext.Current.Cache
   HttpContext.Current.Cache.Remove(DirectCast(de.Key, String))
Next

MSDN Cache.Remove

编辑:以下是有关如何从OutputCache中删除页面的更多信息:

答案 1 :(得分:0)

AFAIK,ASP.NET将检测页面是否已更改,如果是,则将新生成的输出发送到线路(然后将其作为进程的一部分进行缓存);然后,当下次请求页面时,它将从缓存中提取 - 除非页面再次更改。

来自MSDN

  

当a请求缓存页面时   用户,ASP.NET确定是否   缓存输出仍然有效   您为其定义的缓存策略   这页纸。如果输出有效,则   缓存的输出发送到客户端   并且页面未被重新处理。   ASP.NET允许您在运行期间运行代码   这个验证检查,以便你可以   编写自定义逻辑来检查是否   页面有效。

你可能想要研究的是,对于更细粒度的控制(如果你需要它),正在实现一个处理程序,它为你提供缓存中的页面 - 这样做可以让你实现逻辑来确定是否页面是否已更改,并确定是否提供缓存;您可以参考另一个答案来确定如何操作缓存 - 但是,我根本看不到这一点。

答案 2 :(得分:0)

我认为标记的解决方案不适用于II7 +。所以这是我用于非常类似问题的另一种方法。

如果您的数据库是SQL Server,您可以使用SQLDependency,但如果不是,则解决方法是使用filedependency,如下所示。

outputcache机制支持一个可以很好地工作的文件依赖项。每次修改依赖项文件时,页面都会自动清除。

因此,每次成功更新数据库时,都可以让dataentrypage写入日志/文本文件。使日志文件成为相关网页的依赖项。

因此。在您的网页.aspx.cs

protected void Page_Load(object sender,EventArgs e)     {             string fileDependencyPath = Server.MapPath("〜/ dblog / dataupdate.txt");             Response.AddFileDependency(fileDependencyPath); //其余代码     }

在您的dataentrypage.aspx.cs

       string path = "~/dblog/dataupdatelog.txt";
        if (!File.Exists(System.Web.HttpContext.Current.Server.MapPath(path)))
        {
            File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).Close();
        }
        using (StreamWriter w = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path)))
        {
            w.WriteLine("\r\nLog Entry : ");
            w.WriteLine("{0}", DateTime.Now.ToString());
            string strlog = "Some additional info";
            w.WriteLine( strlog);
            w.WriteLine("__________________________");
            w.Flush();
            w.Close();

}