Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
Понадобилось сделать crop + resize на стороне клиента. Если клиентский браузер поддерживает FileStream, картинку перед манипуляциями можно отобразить сразу, без участия сервера. Но для поддержки не самых свежих браузеров приходится загружать файл через AJAX и после отображать клиенту в <img /> по выданному сервером URL. Картинка загружается и хранится как временный файл. Рано или поздно файл должен быть удален, чтобы не загаживать папку тонной загруженных картинок. Вот как это сделал я: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Объект TempImage запихивается в сессию пользователя и хранится там по ключу. Прямого обращения к файлу нет, только через Action по переданному ключу после аплоада. Мои тесты показали, что все файлы до единого рано или поздно удаляются. Правда не всегда сразу после смерти сессии, а когда происходит уборка «мусора» в памяти. Подскажите, есть в данном решении какие-нибудь подводные камни? Может надо как-то по-другому? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 16:43 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
имхо сессия зло. я б сделал фоновую службу и там бы чистил бы по времени жизни к примеру вызывал бы её раз в 1 час и по папке проходился бы все что больше часа валяется удалял бы, писать минимум кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 16:53 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
handmadeFromRu, некий Петя загрузил картинку и приготовился её кропать. в это время на сервере служба берет и чистит все временные файлы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:03 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
а ну да, не заметил, если учитывать время создания файла... но хотелось бы обойтись средствами ASP.NET, без службы. почему сессия — зло? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:05 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
сильно упрощенный код контроллера: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:13 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
hVostt, бросается в глаза ошибочная реализация финализатора. В момент его исполнения значения TempPath/ContentType уже могут быть удалены сборщиком мусора так что нужна проверка на null. Ты проверял удаляются ли файлы если происходит перезапуск пула приложений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:30 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
bazile, На сколько я понимаю, до выполнения финализатора внутренние объекты еще живые в понимании менеджера памяти. Тесты показали, что единственный вариант, когда финализатор не срабатывает, это убить процесс в памяти, ну или какой-то фатальный сбой (пока не наблюдалось). В других случаях, даже с исключениями, допалзающими до базового объекта приложения, файлы удаляются. Остановка и перезапуск пула вызывает немедленную сборку мусора и все временные файлы удаляются. В идеале хотелось бы уничтожения файлов при смерти сессии, но пока не знаю как это сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:36 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
http://msdn.microsoft.com/en-us/library/ms244737(v=vs.80).aspx где перегрузка Dispose))) раз по паттерну. так камешек мелкий) ну можно на Session_End кинуть , но там траблы могут быть если память не изменяет. фоновый процесс и не мучать мозг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:40 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
hVosttНа сколько я понимаю, до выполнения финализатора внутренние объекты еще живые в понимании менеджера памяти. Нас должно больше волновать что происходит во время его выполнения, а не в непонятный момент времени "до выполнения". Когда выполняется ~TempImage() экземплярные поля могут уже быть удалены. hVosttОстановка и перезапуск пула вызывает немедленную сборку мусора и все временные файлы удаляются. Это вызывает сомнение т.к. зачем выполнять сборку мусора если процесс завершается и вся память будет освобождена ОС в любом случае. hVosttВ идеале хотелось бы уничтожения файлов при смерти сессии, но пока не знаю как это сделать. Увы нет способа отловить момент завершения сессии. Есть событие Application.SessionEnd, но на него полагаться не стоит. Можно в фоновом потоке удалять ненужные файлы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:48 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
Удалять должен отдельный сервис - вин сервис через определенный интервал времени либо консольная утилита по шедулеру. Веб приложение не должно знать ни о каких там периодических заданиях. За деструктуризацию через тильду ~ уволить без выплаты выходного пособия. Точка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:54 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
bazile, handmadeFromRu, можно ли считать временный файл нативным ресурсом (ведь я храню всего лишь путь, что является вполне себе управляемым ресурсом) и делать сложную реализацию паттерна IDisposable, как указано в примере на MSDN, или то, что все при нынешней реализации все работает можно считать обыкновенным везением, и не всегда это будет работать? про Session_End тоже думал, для верности видимо можно производить ещё и там очистку. интересует паттерн и родные возможности фреймворка и .NET внешняя служба не укладывается в webdeploy и на некоторых хостингах (shared) попросту нет возможности в такой реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:56 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
МСУ, я посмотрю как ты на шареде пропихнешь свой чудо-сервис. не у всех есть VDS/VPS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:57 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
МСУ, а про вызов деструктора в финализаторе, иди лучше поучи лопоухих ламеров из майкрософт: Код: c# 1. 2. 3. 4. 5. ..из примера на MSDN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 17:59 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
hVostt, тогда гибридный вариант для случая с шаредхостингом. сделать джобу на кварце(ну либ поток на худой конец фоновый) и при старте апп пусть чекает каждые 5 минут на наличия мусора и все ок. если апп выгрузиться и загрузиться почистить полюбак. профит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:05 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
hVosttпочему сессия — зло? И всегда злом была. Почитай Microsoft Application Architecture: http://codearticles.ru/articles/2327 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:10 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
bazileКогда выполняется ~TempImage() экземплярные поля могут уже быть удалены. Выдержка из книжки Рихтера (держу сейчас в руках): Финализацией называется поддерживаемый CLR механизм, позволяющий объекту выполнить корректную очистку, прежде чем сборщик мусора освободить занятую им память . Finalize всегда исполняется в блоке finally. Основное отличие финализатора от деструктра — недетерминированность. В моём случае это не критично. Главное чтобы файл удалился. При смерти сессии удаление файла наилучший вариант, можно сделать это в Session_End. Но для верности, можно положиться на сборщик мусора. Предложите другой вариант, кроме отдельного сервиса, службы или шедулера — это вообще не вариант для моего случая. Нет доступа к службам и шедулерами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:10 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
hVostt, ... а вообще, это принципиально, сохранять временные изображения в виде файлов? ... Я имею в виду, если все преобразования выполнить в MemoryStream, потом вылить его в какую-то пустую страницу через Response, а в качестве урла отдаваемой картинки указать эту страницу? ... я не уверен, как это отработает в MVC, но в Web Forms работает ... Тогда и удалять ничего не надо ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:11 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
handmadeFromRuhVostt, тогда гибридный вариант для случая с шаредхостингом. сделать джобу на кварце(ну либ поток на худой конец фоновый) и при старте апп пусть чекает каждые 5 минут на наличия мусора и все ок. если апп выгрузиться и загрузиться почистить полюбак. профит прям в мвц сайте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:12 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
hVostt, про деструкторы и шедулеры я спорить не буду, подрастешь, сам поймешь. У меня нет времени обучать тупоголового правильным практикам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:12 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
МСУhVosttпочему сессия — зло? И всегда злом была. Почитай Microsoft Application Architecture: http://codearticles.ru/articles/2327 Где? Ты скинул какую-то копипасту неизвестно откуда и назвал её Microsoft Application Architecture. Кроме того, без единой строчки объяснений почему именно так (сам-то хоть понимаешь? или тупо руководствуешься по принципу: чукча не писатель, чукча мсдн-читатель), что снижает ценность этих строк до абсолютного нуля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:15 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
МСУ, типичная детская отговорка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:16 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
carrotikhVostt, ... а вообще, это принципиально, сохранять временные изображения в виде файлов? ... Я имею в виду, если все преобразования выполнить в MemoryStream, потом вылить его в какую-то пустую страницу через Response, а в качестве урла отдаваемой картинки указать эту страницу? ... я не уверен, как это отработает в MVC, но в Web Forms работает ... Тогда и удалять ничего не надо ... преобразования выполняются только после кропа. сперва надо получить, и сразу же отдать тот же самый файл, потом получить параметры ресайза и кропа, выполнить их над файлом, старый файл удалить, а новый уже обработанный сохранить где надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:20 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
МСУ если его ограничивают шарехостинг то надо как то ж выкручиваться (про шедулеры), а вот про деструкторы поясни что не так? Вообще понятие деструктуризации в нете не корректно либ детерминированный вызов (Dispose) либо недетерминированный (Finalizer). hVostt , сессия зло тут нечего даж говорить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:21 |
|
||
|
[ASP.NET MVC] Ленивая очистка временных файлов
|
|||
|---|---|---|---|
|
#18+
handmadeFromRu, да я понимаю. известная на весь мир истена. не понятно только как это зло попало в ASP.NET и почему грамотное использование сессий всегда давало ощутимый профит. например, пишут в рекомендациях, что корзинку в интернет-магазинах не надо хранить в сессии — не понятно зачем такое писать ? это же итак логично и должно быть понятно без этих рекомендаций. а писать «зло» бессмысленно. любой инструмент и возможность можно использовать так, что это будет злом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.05.2013, 18:28 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=38262493&tid=1358419]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 222ms |
| total: | 386ms |

| 0 / 0 |
