2012-08-15 189 views
1

在我的应用程序中,我根据用户选择的选项修改图像。每次修改默认图像时,我都会保存并将其命名为用户ID & date.now.tostring("yyyyMMddHHmmssf"),以解决浏览器缓存问题。这工作正常,但现在我可能会结束很多旧图像。在会话结束时从服务器删除临时文件

现在我该如何删除服务器上我的~/Images/Temp/userID文件夹中的所有图像?我正在考虑在Global.asax中使用Session_EndApplication_end,但我不认为我可以访问任何变量来获取临时图像的路径。

如何在会话结束后删除这些临时文件或类似的东西?

回答

0

会话结束仅针对进程内会话触发,并不能保证(例如,服务器可能会失去电源并且不会触发)。应用程序结束不应该经常触发,并且(正如您所指出的那样),您可能没有执行清理所需的数据。

这不是不好在会话结束时执行清理工作,但对于这个特定的问题,可能会有更好的,更确定的解决方案。

如果唯一的命名是问题的根源,有几个选项浮现在脑海:

  • 使用的命名惯例,它允许您定期运行Windows任务,以确定旧图像,并清除它们。 Powershell对于这样的任务非常灵活。

  • 在名称末尾提供具有不同查询字符串参数的图像,以避免缓存(但保持文件名一致)。

    实施例:<img src="images/tim-medora.jpg?v=123" alt="picture" />

  • 通过处理程序动态提供图像。这使您可以控制缓存设置,更改查询字符串等。

  • 为图像指定自定义扩展名并为该扩展名在IIS中设置不同的缓存设置。只要有效的图像,Web浏览器就不会遇到指向自定义扩展名的图像标记的问题。

+0

查询字符串参数是最简单的...基本上,只需要为文件命名一次,并在更新时覆盖它。然后当你设置你的图像的源代码(在你的代码后面,如果你想),追加一个查询字符串的图像名称。它可以是任何随机值......其目的是欺骗网络浏览器再次下载图像,从而确保您永远不会看到旧的缓存版本的图像。 – 2012-08-15 14:47:39

+0

这就像4答案在一... 1)我试图避免有另一个程序或任务清理旧文件。 2,3,4)由于我仍然不熟悉web开发,因此我必须阅读如何使用这些建议。如果这样做有所不同,我正在做的事情都是通过VS2010中的代码完成的。这可能不是正确的做事方式,但我更像是一个Windows .NET程序员,而不是ASP/Web开发人员。 – daNinja 2012-08-15 14:50:56

+0

查询字符串做了诀窍。现在,每个用户(<200)只会创建一个临时图像。我在http://forums.asp.net/t/1561843.aspx/1找到了一个完美的问题,其中OP几乎完成了我正在做的事情,除了他将修改后的图像保存到处理程序的响应输出流中。如果我能做到这一点,那么我就不需要首先保存这些愚蠢的图像。现在我只需要弄清楚如何使用处理程序.... – daNinja 2012-08-15 16:51:38