5

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

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

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

4

6 回答 6

3

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

有几种方法:

  • 在应用程序启动时,任何人都不应使用这些图像之一。所以你可以删除它
  • 您将图像的引用(例如路径)添加到缓存中,并添加一个 CacheItemRemovedCallback,这将删除您的图像。(很好地限制了 HD 上的图像数量
  • 做一个计时器,定期删除项目

请注意,您不应删除一秒钟前创建的图像。因为它们可以使用。

于 2009-04-30T09:14:52.097 回答
3

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

于 2009-04-30T09:17:58.127 回答
2

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

于 2011-05-13T17:33:08.757 回答
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 工作,但效果很好。

于 2009-06-26T17:29:40.747 回答
0

我们将 application_start 与计时器一起使用,每隔 24 小时运行一次,并每天清理/删除临时文件夹。

于 2009-04-30T09:12:20.120 回答
0

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

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

尽管最好的办法是,如果您可以完全避免临时文件问题,并通过在处理程序中生成文件来根据请求流式传输文件...

于 2009-06-26T17:39:19.550 回答