powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / [ASP.NET MVC] Ленивая очистка временных файлов
25 сообщений из 75, страница 1 из 3
[ASP.NET MVC] Ленивая очистка временных файлов
    #38262379
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понадобилось сделать 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
[ASP.NET MVC] Ленивая очистка временных файлов
    #38262403
handmadeFromRu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо сессия зло. я б сделал фоновую службу и там бы чистил бы по времени жизни к примеру вызывал бы её раз в 1 час и по папке проходился бы все что больше часа валяется удалял бы, писать минимум кода.
...
Рейтинг: 0 / 0
[ASP.NET MVC] Ленивая очистка временных файлов
    #38262417
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
handmadeFromRu,

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

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

Код: 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
[ASP.NET MVC] Ленивая очистка временных файлов
    #38262458
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, бросается в глаза ошибочная реализация финализатора. В момент его исполнения значения TempPath/ContentType уже могут быть удалены сборщиком мусора так что нужна проверка на null.

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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


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