请注意,我不是在谈论编译器生成的“临时 ASP.NET 文件”。
我的 Web 应用程序 (ASP.NET MVC) 使用 Graphviz 生成图像,然后将这些图像提供给客户端。这需要创建临时文件。
处理这些问题的最佳方法是什么?有没有办法在发送后立即删除它们?我应该使用后台线程吗?Application_Start 或 Application_End 中的内容?
请注意,我不是在谈论编译器生成的“临时 ASP.NET 文件”。
我的 Web 应用程序 (ASP.NET MVC) 使用 Graphviz 生成图像,然后将这些图像提供给客户端。这需要创建临时文件。
处理这些问题的最佳方法是什么?有没有办法在发送后立即删除它们?我应该使用后台线程吗?Application_Start 或 Application_End 中的内容?
Graphviz 创建客户端,并将它们作为链接添加到页面中。所以你不能直接删除它们。
有几种方法:
请注意,您不应删除一秒钟前创建的图像。因为它们可以使用。
你不能通过控制器或使用 ASHX ( http://www.marklio.com/marklio/CommentView,guid,df8d6471-83fd-4f66-a799-ef8274979f0e.aspx ) 流出内容并删除写完流后的临时文件?
使用其他用户描述的方法,但要求浏览器再次使用其缓存,方法是在响应中设置 Last-Modifed 标头,然后在图像处理程序中设置 If-Modified-Since 标头,处理程序应回复使用 StatusCode 304“未修改”,只要客户端浏览器未清除其缓存,图像仍会显示。
我喜欢处理由生成它们的同一操作中的操作创建的临时文件。例如:(在 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 工作,但效果很好。
我们将 application_start 与计时器一起使用,每隔 24 小时运行一次,并每天清理/删除临时文件夹。
您可以创建一个处理程序 (.ashx) 并通过它流式传输临时文件。这样你就会知道文件已经传输到客户端,你可以在处理程序的末尾删除临时文件。
一个可能的问题是客户端将无法下载该文件两次,因为您要立即删除它。(然后可以使用页面输出缓存来缓解......)
尽管最好的办法是,如果您可以完全避免临时文件问题,并通过在处理程序中生成文件来根据请求流式传输文件...