繁体   English   中英

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

[英]How to deal with temporary files in ASP.NET?

请注意,我不是在谈论编译器生成的“临时ASP.NET文件”。

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

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

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

有几种方法:

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

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

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

使用其他用户描述的方法但是如果想要图像再次通过在响应中设置Last-Modifed标头然后在图像处理程序中获得If-Modified-Since标头,则要求浏览器使用其缓存,处理程序应该回复使用StatusCode 304“NOT Modified”,只要客户端浏览器尚未清除其缓存,图像仍会显示。

我喜欢在生成它们的同一个动作中处理由动作创建的临时文件。 例如:(在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()被大量调用,你可以添加一些逻辑,只是经常调用cleanup。 这有点像穷人的cron工作,但效果很好。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM