Как бороться с временными файлами в ASP.NET? - PullRequest
5 голосов
/ 30 апреля 2009

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

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

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

Ответы [ 6 ]

3 голосов
/ 30 апреля 2009

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

3 голосов
/ 30 апреля 2009

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

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

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

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

2 голосов
/ 13 мая 2011

Используйте метод, описанный другим пользователем , но попросите браузер использовать свой кэш, если он снова хочет изображение, установив заголовок Last-Modifed в ответе, затем в обработчике изображения, если вы получите Заголовок If-Modified-Since, обработчик должен ответить с StatusCode 304 «НЕ изменен» таким образом, что изображение все еще отображается, пока браузер клиента не очистил свой кэш.

1 голос
/ 26 июня 2009

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

0 голосов
/ 26 июня 2009

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

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

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

0 голосов
/ 30 апреля 2009

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

...