Всемогущий, Google, найди мне чего-нибудь!

понедельник, 23 августа 2010 г.

Сброс сессии при работе с папками веб-приложения

Итак. Прошло уже достаточно времени для того, чтобы определиться с темой нового поста. Речь сегодня пойдет о технологии ASP.NET 2.0+.

Много, кому из разработчиков ASP.NET, когда-либо приходилось писать приложения для мониторинга какого-либо процесса, например, работы с файлами или загрузки данных в БД. У каждой подобной задачи есть свои подводные камни. Сейчас хочу вытащить и рассказать про один такой же даже не камень, а булыжник.


Задача заключалась в следующем: через аплоад на сервер загружался архив с файлами, предоставленными в определенно заданном формате. Данный архив распаковывался, файлы обрабатывались с помощью заведомо написанных регулярных выражений и данные заливались в БД. Для этого использовались 2 потока: один из пула, второй - отдельный поток для разбора и загрузки данных. Из пула поток выполнялся, страница рендерилась и на клиенте каждые 1-2 секунды слались запросы на наличие файлов в папке (прогресс бар). Также для загрузки данных использовалась одна и та же папка (tmp, внутри директории веб-приложения), поэтому для того, чтобы несколько пользователей могли загружать данные, пользователю выделялась папка (имя папки было сгенерировано через Guid.NewGuid()). После того, как данные были загружены папка пользователя удалялась. И вот тут вот начинался весь парад...

Сессия (в файле web.config было настроено на хранение сессии в процессе - InProc), по непонятным причинам скидывалась. Я потратил три дня, облазил "стописот" форумов и на третий день под вечер наткнулся на одну интересную тему, где была описана проблема в том, что при использовании метода Directory.Delete, сессия сбрасывалась. Ссылку сейчас предоставить не могу, ибо на работе осталась.

Посему, если вы используете папку tmp или Temp (или любое другое название) для хранения временных файлов, и она находится в директории веб-приложения, то перенесите её вне папки веб-приложения и тогда у вас всё будет работать нормально и как положено.

P.S.
Из той же темы один из программистов Microsoft написал, что это не "баг", а "фича". Чтобы долго и счастливо им жить с такими фичами =).

Комментариев нет: