2009-04-30 2 views
5

Обратите внимание, что я не говорю о созданных компилятором «Временных файлах ASP.NET».Как работать с временными файлами в ASP.NET?

Мое веб-приложение (ASP.NET MVC) использует Graphviz для генерации изображений, которые затем передаются клиенту. Для этого требуется создание временных файлов.

Каков наилучший способ справиться с этим? Есть ли способ удалить их сразу же после их отправки? Должен ли я использовать фоновый поток? Что-то в Application_Start или Application_End?

ответ

3

не могли бы вы сделать это через контроллер или использовать ASHx (http://www.marklio.com/marklio/CommentView,guid,df8d6471-83fd-4f66-a799-ef8274979f0e.aspx), чтобы поток из содержимого и удалить временные файлы, как только вы закончили выписывать поток?

+0

Ссылка не работает, можете ли вы разработать? – Chadwick

+0

попробуйте http://www.marklio.com/marklio/PermaLink,guid,df8d6471-83fd-4f66-a799-ef8274979f0e.aspx – jamie

0

мы используем application_start с таймером, который запускается с интервалом каждые 24 часа и очищает/удаляет папку временных файлов один раз в день.

3

Graphviz создает клиента и добавляет их как ссылку на страницу. , поэтому вы не можете удалить их напрямую.

Есть несколько способов:

  • при запуске приложения, никто не должен использовать один из этих изображений. поэтому вы можете удалить его
  • вы добавляете ссылку на изображение (например, путь) в кэш и добавляете CacheItemRemovedCallback, который удалит ваше изображение. (Лимиты славно сумма изображений на вашем HD
  • сделать таймер, который удаляет элементы периодически

быть в курсе, что вы не должны удалять изображения, которые создаются только секунду назад. Из-за они могут быть использованы.

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() вызывается много, вы можете добавить некоторую логику только вызов очистку каждый так часто. Это похоже на работу бедного человека, но она работает хорошо.

0

Вы можете создать обработчик (.ashx) и передать через него временный файл. Таким образом, вы узнаете, что файл был передан клиенту, и вы можете удалить временный файл в конце обработчика.

Возможная проблема заключается в том, что клиент не сможет загрузить файл дважды, так как вы удаляете его немедленно. (Который тогда можно было бы смягчить, используя кеш-вывод страницы ...)

Хотя было бы лучше, если бы вы могли избежать проблемы с temp-файлом по всему и вывести файл по запросу, это в обработчике ...

2

Используйте method described by other user, но попросите браузер использовать его кеш, если он хочет изображение снова, установив заголовок Last-Modifed в ответе, а затем в обработчике изображения, если вы получите If-Modified -Используя заголовок, обработчик должен ответить StatusCode 304 «NOT Modified» таким образом, что изображение все еще отображается, пока клиентский браузер не очистил кеш.

Смежные вопросы