Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / [ASP.NET MVC] Ленивая очистка временных файлов / 25 сообщений из 75, страница 1 из 3
17.05.2013, 16:43
    #38262379
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
Понадобилось сделать 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.
		public class TempImage : IDisposable
		{
			public string FileName { get; set; }
			public string ContentType { get; set; }
			public string TempPath { get; set; }

			private bool _isDisposed;

			public void Dispose()
			{
				if (_isDisposed)
					return;
				try
				{
					System.IO.File.Delete(TempPath);
					_isDisposed = true;
				}
				catch (Exception ex)
				{
					Log.DebugException(ex.Message, ex);
				}
			}

			~TempImage()
			{
				Dispose();
			}
		}



Объект TempImage запихивается в сессию пользователя и хранится там по ключу. Прямого обращения к файлу нет, только через Action по переданному ключу после аплоада.

Мои тесты показали, что все файлы до единого рано или поздно удаляются. Правда не всегда сразу после смерти сессии, а когда происходит уборка «мусора» в памяти.

Подскажите, есть в данном решении какие-нибудь подводные камни? Может надо как-то по-другому?
...
Рейтинг: 0 / 0
17.05.2013, 16:53
    #38262403
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
имхо сессия зло. я б сделал фоновую службу и там бы чистил бы по времени жизни к примеру вызывал бы её раз в 1 час и по папке проходился бы все что больше часа валяется удалял бы, писать минимум кода.
...
Рейтинг: 0 / 0
17.05.2013, 17:03
    #38262417
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
handmadeFromRu,

некий Петя загрузил картинку и приготовился её кропать. в это время на сервере служба берет и чистит все временные файлы.
...
Рейтинг: 0 / 0
17.05.2013, 17:05
    #38262423
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
а ну да, не заметил, если учитывать время создания файла... но хотелось бы обойтись средствами ASP.NET, без службы.

почему сессия — зло?
...
Рейтинг: 0 / 0
17.05.2013, 17:13
    #38262435
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
сильно упрощенный код контроллера:

Код: 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.
		private const string TempFolder = "~/App_Data/tmp/";

		public ActionResult Image(string id)
		{
			var temp = Session[id] as TempImage;
			if (temp == null || !System.IO.File.Exists(temp.Path))
				return HttpNotFound();
			return File(temp.Path, temp.ContentType);
		}

		[HttpPost]
		public ActionResult Upload()
		{
			if (Request.Files.Count > 0 && Request.Files[0] != null && Request.Files[0].ContentLength > 0)
			{
				var upload = Request.Files[0];
				var temp = new TempImage
					{
						FileName = upload.FileName,
						ContentType = upload.ContentType
					};
				var token = Guid.NewGuid().ToString("N");
				temp.TempPath = Server.MapPath(TempFolder + token + System.IO.Path.GetExtension(upload.FileName));
				upload.SaveAs(temp.TempPath);
				Session[token] = temp;
				return Json(new
					{
						status = "Ok",
						image = Url.Action("Image", new { id = token }),
						token
					});
			}
			return Json(new
				{
					status = "Error"
				});
		}
...
Рейтинг: 0 / 0
17.05.2013, 17:30
    #38262458
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
hVostt, бросается в глаза ошибочная реализация финализатора. В момент его исполнения значения TempPath/ContentType уже могут быть удалены сборщиком мусора так что нужна проверка на null.

Ты проверял удаляются ли файлы если происходит перезапуск пула приложений?
...
Рейтинг: 0 / 0
17.05.2013, 17:36
    #38262464
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
bazile,

На сколько я понимаю, до выполнения финализатора внутренние объекты еще живые в понимании менеджера памяти. Тесты показали, что единственный вариант, когда финализатор не срабатывает, это убить процесс в памяти, ну или какой-то фатальный сбой (пока не наблюдалось). В других случаях, даже с исключениями, допалзающими до базового объекта приложения, файлы удаляются. Остановка и перезапуск пула вызывает немедленную сборку мусора и все временные файлы удаляются.

В идеале хотелось бы уничтожения файлов при смерти сессии, но пока не знаю как это сделать.
...
Рейтинг: 0 / 0
17.05.2013, 17:40
    #38262468
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
http://msdn.microsoft.com/en-us/library/ms244737(v=vs.80).aspx где перегрузка Dispose))) раз по паттерну. так камешек мелкий)
ну можно на Session_End кинуть , но там траблы могут быть если память не изменяет. фоновый процесс и не мучать мозг
...
Рейтинг: 0 / 0
17.05.2013, 17:48
    #38262485
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
hVosttНа сколько я понимаю, до выполнения финализатора внутренние объекты еще живые в понимании менеджера памяти.
Нас должно больше волновать что происходит во время его выполнения, а не в непонятный момент времени "до выполнения". Когда выполняется ~TempImage() экземплярные поля могут уже быть удалены.

hVosttОстановка и перезапуск пула вызывает немедленную сборку мусора и все временные файлы удаляются.
Это вызывает сомнение т.к. зачем выполнять сборку мусора если процесс завершается и вся память будет освобождена ОС в любом случае.

hVosttВ идеале хотелось бы уничтожения файлов при смерти сессии, но пока не знаю как это сделать.
Увы нет способа отловить момент завершения сессии. Есть событие Application.SessionEnd, но на него полагаться не стоит.

Можно в фоновом потоке удалять ненужные файлы.
...
Рейтинг: 0 / 0
17.05.2013, 17:54
    #38262493
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
Удалять должен отдельный сервис - вин сервис через определенный интервал времени либо консольная утилита по шедулеру. Веб приложение не должно знать ни о каких там периодических заданиях. За деструктуризацию через тильду ~ уволить без выплаты выходного пособия. Точка.
...
Рейтинг: 0 / 0
17.05.2013, 17:56
    #38262497
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
bazile, handmadeFromRu,

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

про Session_End тоже думал, для верности видимо можно производить ещё и там очистку.
интересует паттерн и родные возможности фреймворка и .NET

внешняя служба не укладывается в webdeploy и на некоторых хостингах (shared) попросту нет возможности в такой реализации.
...
Рейтинг: 0 / 0
17.05.2013, 17:57
    #38262501
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
МСУ,

я посмотрю как ты на шареде пропихнешь свой чудо-сервис. не у всех есть VDS/VPS.
...
Рейтинг: 0 / 0
17.05.2013, 17:59
    #38262503
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
МСУ,

а про вызов деструктора в финализаторе, иди лучше поучи лопоухих ламеров из майкрософт:

Код: c#
1.
2.
3.
4.
5.
 ~Resource() 
    {
        // Finalizer calls Dispose(false)
        Dispose(false);
    }



..из примера на MSDN
...
Рейтинг: 0 / 0
17.05.2013, 18:05
    #38262513
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
hVostt, тогда гибридный вариант для случая с шаредхостингом. сделать джобу на кварце(ну либ поток на худой конец фоновый) и при старте апп пусть чекает каждые 5 минут на наличия мусора и все ок. если апп выгрузиться и загрузиться почистить полюбак. профит
...
Рейтинг: 0 / 0
17.05.2013, 18:10
    #38262523
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
hVosttпочему сессия — зло?
И всегда злом была. Почитай Microsoft Application Architecture: http://codearticles.ru/articles/2327
...
Рейтинг: 0 / 0
17.05.2013, 18:10
    #38262524
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
bazileКогда выполняется ~TempImage() экземплярные поля могут уже быть удалены.

Выдержка из книжки Рихтера (держу сейчас в руках):

Финализацией называется поддерживаемый CLR механизм, позволяющий объекту выполнить корректную очистку, прежде чем сборщик мусора освободить занятую им память .

Finalize всегда исполняется в блоке finally. Основное отличие финализатора от деструктра — недетерминированность. В моём случае это не критично. Главное чтобы файл удалился. При смерти сессии удаление файла наилучший вариант, можно сделать это в Session_End. Но для верности, можно положиться на сборщик мусора. Предложите другой вариант, кроме отдельного сервиса, службы или шедулера — это вообще не вариант для моего случая. Нет доступа к службам и шедулерами.
...
Рейтинг: 0 / 0
17.05.2013, 18:11
    #38262527
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
hVostt,

... а вообще, это принципиально, сохранять временные изображения в виде файлов? ... Я имею в виду, если все преобразования выполнить в MemoryStream, потом вылить его в какую-то пустую страницу через Response, а в качестве урла отдаваемой картинки указать эту страницу? ... я не уверен, как это отработает в MVC, но в Web Forms работает ... Тогда и удалять ничего не надо ...
...
Рейтинг: 0 / 0
17.05.2013, 18:12
    #38262528
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
handmadeFromRuhVostt, тогда гибридный вариант для случая с шаредхостингом. сделать джобу на кварце(ну либ поток на худой конец фоновый) и при старте апп пусть чекает каждые 5 минут на наличия мусора и все ок. если апп выгрузиться и загрузиться почистить полюбак. профит
прям в мвц сайте
...
Рейтинг: 0 / 0
17.05.2013, 18:12
    #38262529
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
hVostt, про деструкторы и шедулеры я спорить не буду, подрастешь, сам поймешь. У меня нет времени обучать тупоголового правильным практикам.
...
Рейтинг: 0 / 0
17.05.2013, 18:15
    #38262532
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
МСУhVosttпочему сессия — зло?
И всегда злом была. Почитай Microsoft Application Architecture: http://codearticles.ru/articles/2327

Где? Ты скинул какую-то копипасту неизвестно откуда и назвал её Microsoft Application Architecture. Кроме того, без единой строчки объяснений почему именно так (сам-то хоть понимаешь? или тупо руководствуешься по принципу: чукча не писатель, чукча мсдн-читатель), что снижает ценность этих строк до абсолютного нуля.
...
Рейтинг: 0 / 0
17.05.2013, 18:16
    #38262533
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
МСУ,

типичная детская отговорка
...
Рейтинг: 0 / 0
17.05.2013, 18:20
    #38262539
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
carrotikhVostt,

... а вообще, это принципиально, сохранять временные изображения в виде файлов? ... Я имею в виду, если все преобразования выполнить в MemoryStream, потом вылить его в какую-то пустую страницу через Response, а в качестве урла отдаваемой картинки указать эту страницу? ... я не уверен, как это отработает в MVC, но в Web Forms работает ... Тогда и удалять ничего не надо ...

преобразования выполняются только после кропа. сперва надо получить, и сразу же отдать тот же самый файл, потом получить параметры ресайза и кропа, выполнить их над файлом, старый файл удалить, а новый уже обработанный сохранить где надо.
...
Рейтинг: 0 / 0
17.05.2013, 18:21
    #38262541
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
МСУ если его ограничивают шарехостинг то надо как то ж выкручиваться (про шедулеры), а вот про деструкторы поясни что не так? Вообще понятие деструктуризации в нете не корректно либ детерминированный вызов (Dispose) либо недетерминированный (Finalizer).
hVostt , сессия зло тут нечего даж говорить
...
Рейтинг: 0 / 0
17.05.2013, 18:28
    #38262547
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
handmadeFromRu,

да я понимаю. известная на весь мир истена. не понятно только как это зло попало в ASP.NET и почему грамотное использование сессий всегда давало ощутимый профит.

например, пишут в рекомендациях, что корзинку в интернет-магазинах не надо хранить в сессии — не понятно зачем такое писать ? это же итак логично и должно быть понятно без этих рекомендаций. а писать «зло» бессмысленно. любой инструмент и возможность можно использовать так, что это будет злом.
...
Рейтинг: 0 / 0
17.05.2013, 18:31
    #38262552
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[ASP.NET MVC] Ленивая очистка временных файлов
hVosttполучить параметры ресайза и кропа, выполнить их над файлом, старый файл удалить, а новый уже обработанный сохранить где надо.Новый файл и есть временный файл?
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / [ASP.NET MVC] Ленивая очистка временных файлов / 25 сообщений из 75, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]