【问题标题】:Delete temp files on Session end in ASP.NET在 ASP.NET 的会话结束时删除临时文件
【发布时间】:2014-06-06 14:43:15
【问题描述】:

我的网站在从 pdf 转换文档时创建了一堆 png 文件。我拥有唯一标识的所有这些文件,我希望在会话结束时将它们删除。我的想法是创建一个列表,将其存储在 Session 中,并通过存储在我的 List 中的路径删除每个文件。

在 Global.asax 我添加了:

void Session_End(object sender, EventArgs e) 
{
    if (Session["cleanUpCollection"] != null)
    { 
        List<String> deletePaths = ((List<string>)(Session["cleanUpCollection"]));
        foreach(String s in deletePaths)
        {
            try
            {
                System.IO.File.Delete(s);
            }
            catch { }
        }
    }
}

在 web.config 我添加了这个:

<sessionState mode="InProc" cookieless="false" timeout="20" />

但文件仍位于临时位置。 我还没有测试失败的地方,但是在会话结束时删除临时文件有更好、更常见的做法吗? 顺便说一句,我验证并 cleanUpCollection 存储本地服务器的路径,因此文件路径没有错误。

【问题讨论】:

  • 你处理这件事的方式对我来说很有意义。你确定这些文件还没有被使用吗? Image 和 Bitmap 类有一些非常喜欢挂在引用上的方法;如果您不处置该类,则文件引用仍处于打开状态,并且文件删除将在会话结束时失败。
  • @Lynn Crumbling - 看起来 Session_End 和 Application_End 中的代码没有被执行。我添加了一些代码来将日志条目写入 Application_Start、end 和 Session_End 上的 txt 文件,以及为生成这些 PNG 文件的页面添加 Page_Unload。在 Unload 事件中,我要求应用列出刚刚放置在 Session 变量中的所有字符串项(文件路径)。在 Application_Start 和 Page_Unload 上正确创建日志条目。没有来自 Session_End 和 Application_End 事件的条目,因此导致我得出事件未正确触发的结论。
  • 首先 - 您是否在 Session_End 中使用任何请求、响应或服务器对象?如果是这样,那是你的例外。

标签: c# asp.net webforms


【解决方案1】:

对此更有效的方法是在您的服务器(站点外部)上运行一个计划作业,定期清理此文件夹,删除超过特定年龄的文件。依靠会话超时来解决这个问题并不理想。

我还要注意,您没有向我们说明发生了什么错误或文件未删除的原因。如需更多帮助,请提供一些信息。

【讨论】:

  • @Paddy - 我把预定的工作记在脑后。与此同时,我刚刚添加了一些代码来将 Session 的活动写入文本文件。到目前为止,我验证了项目已正确添加并保存到 Session 中,并且可以从 Session 中检索。现在我正在等待会话超时。我下令将所有异常写入文本文件。
【解决方案2】:

将超时设置为 20,这意味着在会话被放弃并执行您的代码之前需要 20 分钟。此外,除非会话空闲并且当有人导航到另一个页面或关闭浏览器时不会触发 Session_End 事件,否则不会触发 Session_End 事件,因此此代码可能不会总是清理目录。

我建议在创建 PDF 后删除文件,而不是等待用户会话结束后再删除。

【讨论】:

  • -1 Session_End 事件将始终在会话超时后触发。说如果用户浏览到另一个页面或关闭浏览器,代码可能并不总是清理目录是完全错误的。
  • @sharpguru - 只是为了澄清,我正在删除 .png 文件。我正在将 PDF 转换为 PNG,因此无论平台如何,它们都可以在任何浏览器中查看。
  • @LynnCrumbling 真的吗?因为在我刚刚执行的测试中,这不是真的。我关闭了应用程序并且 session_end 永远不会触发。是否有一些设置允许asp应用程序在应用程序生命周期结束后继续运行并拦截事件?诚恳地问。无论用户操作如何(特别是当他们关闭浏览器并走开时),我都有需要清理的文件 - 并且文件在 session_end 应该清理它们很久之后仍保留在 Files 目录中
  • @LynnCrumbling - 我收回我的声明。我在这里看到您在谈论实际的会话文件或应用程序的内存数据,而不是位于文件系统上的其他一些外部复制的文件(如果我理解正确的话)。我正在寻找一种方法来清理我重命名为 sessionID_filename.extension 并复制到 IIS 上的 Files 目录的文件——不管用户的操作如何,我还没有找到一种可靠的方法来做到这一点。我正在使用 session_end 删除它们,但是当浏览器关闭时不会发生这种情况
  • @LynnCrumbling 观看 24 小时后 - 唯一一次被复制到 Files 目录的文件被删除(如果没有被会话超时或显式 session_end 事件捕获,即没有被浏览器窗口关闭)是应用程序池被回收的时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 2016-06-02
  • 2020-06-03
  • 2011-02-19
相关资源
最近更新 更多