【问题标题】:How to programatically clear ASP.NET cache?如何以编程方式清除 ASP.NET 缓存?
【发布时间】:2011-07-22 07:18:47
【问题描述】:

在 ASP.NET Webforms 中,我可以使用 来缓存网页。我有非常静态的数据,不会经常更新,但是当它更新时,网页上的 HTML 会发生变化。这些数据将与一个管理系统相关联,允许维护人员进行适当的编辑。

我想有一种方法可以将 OutputCache 的持续时间设置为非常长。但是我也希望能够在数据更新时从缓存中清除这个网页(最好是从数据编辑页面)。

在 ASP.NET 中完成此任务的标准方法是什么?

【问题讨论】:

    标签: asp.net caching


    【解决方案1】:
    For Each de As DictionaryEntry In HttpContext.Current.Cache
       HttpContext.Current.Cache.Remove(DirectCast(de.Key, String))
    Next
    

    MSDN Cache.Remove

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

    【讨论】:

    • @Oskar:C#中的方式是一样的,你有problems with converting吗? foreach (DictionaryEntry de in HttpContext.Current.Cache) { HttpContext.Current.Cache.Remove((string)de.Key); }
    • 它是为了幽默。
    • 此代码在 IIS 7+ 中不起作用,因为它不会缓存在 HttpContext.Current.Cache 上,因为它默认使用内核缓存。按照答案中的链接并使用 HttpResponse.RemoveOutputCacheItem("vistual path to page here");方法。更多信息在这里stackoverflow.com/questions/565239/…
    • @Gabriel:好点,我忘记了内核缓存(也可以在 IIS7 中启用)。但是,上面的 Removeoutputcacheitem 方法我不是已经提到了吗?关注我的链接。
    【解决方案2】:

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

    来自MSDN

    当一个缓存页面被一个 用户,ASP.NET 确定是否 缓存的输出仍然有效,基于 您为其定义的缓存策略 这页纸。如果输出有效,则 缓存的输出被发送到客户端 并且页面没有被重新处理。 ASP.NET 允许您在 此验证检查,以便您可以 编写自定义逻辑来检查是否 该页面有效。

    但是,对于更细粒度的控制(如果需要),您可能想要研究的是实现一个处理程序,该处理程序为您从缓存中提供页面 - 这样做可以让您实现逻辑以确定是否页面是否发生变化,判断是否提供缓存;您可以参考其他答案来确定如何操作缓存 - 但是,我根本看不到需要这样做。

    【讨论】:

      【解决方案3】:

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

      如果您的数据库是 SQL Server,您可以使用 SQLDependency,但如果不是,解决方法是使用文件依赖项,如下所示。

      输出缓存机制支持完美运行的文件依赖。每次修改依赖文件时,您的页面都会自动清除。

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

      所以。在你的webpage.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();
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        相关资源
        最近更新 更多