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

5
请注意,我不是在谈论编译器生成的“Temporary ASP.NET Files”。
我的Web应用程序(ASP.NET MVC)使用Graphviz生成图像,然后将其提供给客户端。这需要创建临时文件。
如何处理这些文件?是否有一种方法可以在发送后立即删除它们?我应该使用后台线程吗?在Application_Start或Application_End中进行某些操作?
6个回答

3

Graphviz创建客户端,并将它们作为页面中的链接添加,因此您不能直接删除它们。

有几种方法:

  • 在应用程序启动时,没有人应该使用这些图像之一。因此,您可以将其删除
  • 将对图像的引用(例如路径)添加到缓存中,并添加CacheItemRemovedCallback,该回调将删除您的图像。(很好地限制了您硬盘上的图像数量)
  • 制作一个定时器,定期删除项目

请注意,不应删除刚刚创建的图像,因为它们可能会被使用。


3

链接已经失效了,你能详细说明一下吗? - Chadwick
请尝试访问http://www.marklio.com/marklio/PermaLink,guid,df8d6471-83fd-4f66-a799-ef8274979f0e.aspx。 - jamie

2
使用其他用户描述的方法,但是通过在响应中设置Last-Modified头请求浏览器在需要再次获取图像时使用其缓存,然后在图像处理程序中,如果您获得If-Modified-Since头,则处理程序应该回复StatusCode 304“未修改”,这样只要客户端浏览器没有清除其缓存,图像仍将显示。

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 作业,但它运行良好。

0
您可以创建一个处理程序(.ashx),并通过该处理程序流传递临时文件。这样,您就会知道文件已传输到客户端,并且您可以在处理程序结束时删除临时文件。
这种方法可能的问题是客户端将无法下载文件两次,因为您立即删除了它。(可以使用页面输出缓存来缓解这个问题...)
尽管最好的方法是如果您可以避免整个临时文件问题,并通过在处理程序中生成文件来提供请求的流。

0

我们使用application_start和计时器一类的工具来每24小时运行一次,清理/删除临时文件夹中的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接