请注意,我不是在谈论编译器生成的“Temporary ASP.NET Files”。
我的Web应用程序(ASP.NET MVC)使用Graphviz生成图像,然后将其提供给客户端。这需要创建临时文件。
处理这些问题的最佳方法是什么?有没有办法在发送后立即删除它们?我应该使用后台线程吗? Application_Start或Application_End中的东西?
答案 0 :(得分:3)
Graphviz创建客户端,并将其添加为页面中的链接。 所以你不能直接删除它们。
有几种方法:
请注意,您不应删除仅在一秒前创建的图像。由于它们可以使用。
答案 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)并通过它传输临时文件。这样你就会知道文件已被转移到客户端,你可以删除处理程序末尾的临时文件。
此问题可能是客户端无法下载文件两次,因为您要立即删除它。 (然后可以使用页面输出缓存来缓解...)
虽然最好的办法是,如果你能够完全避免临时文件问题,并根据请求流出文件,通过在处理程序中生成它......