我正在用 asp.net 2.0 在 win2003 上构建一个小型 webapp。我需要创建我认为可以通过网络访问的小文件,并且这些文件应该有 10 分钟的到期时间。我在框架中没有找到对此的任何支持,我想到的另一个解决方案是有一个计划作业,每 X 分钟清理一次文件。但不知何故,我认为我不是第一个遇到这个问题并想知道是否有任何其他智能解决方案的人。
提前致谢。
我正在用 asp.net 2.0 在 win2003 上构建一个小型 webapp。我需要创建我认为可以通过网络访问的小文件,并且这些文件应该有 10 分钟的到期时间。我在框架中没有找到对此的任何支持,我想到的另一个解决方案是有一个计划作业,每 X 分钟清理一次文件。但不知何故,我认为我不是第一个遇到这个问题并想知道是否有任何其他智能解决方案的人。
提前致谢。
在不了解您为什么这样做的情况下,我认为您使用外部程序清除文件的解决方案是最好的解决方案。另一种方法可能是将“文件”存储在数据库中并创建一个从数据库中检索数据的处理程序,但前提是“文件”未过期。然后,您可以在数据库上安排清理任务的频率要低得多,并且仍然只提供未过期的“文件”。在磁盘上创建它们会迫使您定期进行清理,以确保过期的项目不再可用。
我想您也可以使用磁盘文件执行处理程序,并在提供文件之前检查创建日期。在这种情况下,包含实际文件的文件夹需要位于网站之外或位于禁止普通用户直接访问的受限区域中。
由于它很小,如果您想保持简单,只需检查对网站的每 N 个请求。如果您认为要清理的文件数量可能会变大,请在找到一些要清理的文件后停止清理,让下一个请求清理更多文件。优点是您不必管理外部作业(并安装它并保持运行等)。
对于大型网站来说可能不是一个好主意。
目的是控制远程用户的文件访问吗?
您可以创建 Windows 服务或计划的控制台应用程序来定期删除过期的目录/文件。或者,您可以让您的 Web 应用程序管理文件响应,而不是直接从您的网页链接到文件。一旦文件超过了某个年龄,只需对您的应用程序进行编码以根本不返回文件。
这与我过去所做的类似
protected void Button1_Click(object sender, EventArgs e)
{
string fileName = @"c:\SecureDirectory\DownloadableFile.txt";
int exipireMinutes = -10;
if (System.IO.File.Exists(fileName) && System.IO.File.GetCreationTime(fileName) >= DateTime.Now.AddMinutes(exipireMinutes))
{
byte[] fileBinary;
using (System.IO.FileStream fs = System.IO.File.Open(Server.MapPath(fileName), System.IO.FileMode.Open))
{
fileBinary = new byte[fs.Length];
fs.Read(fileBinary, 0, Convert.ToInt32(fs.Length));
}
Response.AddHeader("Content-disposition", "attachment; filename=" + fileName);
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(fileBinary);
Response.End();
}
}