如何处理ASP.NET中的临时文件?

时间:2009-04-30 09:02:46

标签: asp.net temporary-files

请注意,我不是在谈论编译器生成的“Temporary ASP.NET Files”。

我的Web应用程序(ASP.NET MVC)使用Graphviz生成图像,然后将其提供给客户端。这需要创建临时文件。

处理这些问题的最佳方法是什么?有没有办法在发送后立即删除它们?我应该使用后台线程吗? Application_Start或Application_End中的东西?

6 个答案:

答案 0 :(得分:3)

Graphviz创建客户端,并将其添加为页面中的链接。 所以你不能直接删除它们。

有几种方法:

  • 在应用程序启动时,没有人应该使用其中一个图像。所以你可以删除它
  • 您将图像的引用(例如路径)添加到缓存中,并添加一个CacheItemRemovedCallback,它将删除您的图像。 (很好地限制了高清图像的数量
  • 制作定时器,定期删除项目

请注意,您不应删除仅在一秒前创建的图像。由于它们可以使用。

答案 1 :(得分:3)

你不能通过控制器或使用ASHX(http://www.marklio.com/marklio/CommentView,guid,df8d6471-83fd-4f66-a799-ef8274979f0e.aspx)流出内容并在写完流后删除临时文件吗?

答案 2 :(得分:2)

使用method described by other user但要求浏览器使用其缓存,如果它想要图像再次通过在响应中设置Last-Modifed标头然后在图像处理程序中如果你得到一个 If-Modified-Since标头,处理程序应回复StatusCode 304" NOT Modified"这样,只要客户端浏览器没有清除其缓存,图像仍会显示。

答案 3 :(得分:1)

我喜欢在生成它们的同一操作中处理由操作创建的临时文件。例如:(在MVC中,但这可以适用于任何框架)

public ActionResult Foo()
{
    FooCleanup(); // deletes files in "~/temp/Foo/" older than a day or so

    string filename = CreateTemporaryFile(); // Creates a temporary file like "~/temp/Foo/{timestamp}.foo"
    return File(filename);
}

如果Foo()被大量调用,你可以添加一些逻辑,只是经常调用清理。这有点像穷人的cron工作,但效果很好。

答案 4 :(得分:0)

我们使用带有计时器类型的application_start以每24小时的间隔运行,并且每天清理/删除临时文件文件夹一次。

答案 5 :(得分:0)

您可以创建一个处理程序(.ashx)并通过它传输临时文件。这样你就会知道文件已被转移到客户端,你可以删除处理程序末尾的临时文件。

此问题可能是客户端无法下载文件两次,因为您要立即删除它。 (然后可以使用页面输出缓存来缓解...)

虽然最好的办法是,如果你能够完全避免临时文件问题,并根据请求流出文件,通过在处理程序中生成它......