Хранение временных пользовательских файлов в ASP.NET со средним доверием
У меня есть сценарий, когда пользователи моего веб-приложения ASP.NET представляют отзывы, содержащие текстовую информацию и изображения. Процесс отправки состоит из следующих шагов:
- Сначала пользователь вводит контент и выбирает путь к изображению
- Когда он нажимает на предварительный просмотр, информация снова отображается, чтобы он мог подтвердить
- После подтверждения информация сохраняется в базе данных
Проблема в том, что я не хочу сохранять загруженные изображения в БД до того, как пользователь подтвердит. Вместо этого я храню их как временные файлы и помещаю их в БД только после окончательного подтверждения.
Поскольку я также хочу, чтобы мое приложение работало со средним доверием, у меня есть права на запись только в каталог приложения и нигде вне его. Я даже хочу ограничить права на запись для пользователя ASPNET / NETWORK SERVICE в папку ~/App_Data. Проблема моего сценария заключается в том, что после создания временного файла в этой папке пул приложений перерабатывается, и я не хочу этого при каждой отправке отзыва.
Как вы посоветуете хранить эти временные файлы? Пул не перезапускается, если я обновляю файл - только при создании или переименовании. Но я не думаю, что могу хранить целые изображения в одном файле для всех пользователей. Как вы думаете?
ОБНОВЛЕНИЕ: я должен отметить, что я использую сторонний контроль для загрузки. Это дает мне программный доступ к двоичному потоку содержимого файла после загрузки, но я не могу сохранить его после второй обратной передачи (первый шаг и обратная передача фактически выполняют загрузку).
4 ответа
Я бы порекомендовал IsolatedStorage. Это своего рода виртуальная папка.
Вот выдержка из примера на CodeProject:
IsolatedStorageFileStream stream =
new IsolatedStorageFileStream(ISOLATED_FILE_NAME,
FileMode.Create, isoStore);
StreamWriter writer = new StreamWriter( stream );
writer.WriteLine( "This is my first line in the isolated storage file." );
writer.WriteLine( "This is second line." );
writer.Close();
ОБНОВЛЕНИЕ: чтобы очистить ваш файл, просто сделайте это:
string fileName = "isolatestorage.txt";
IsolatedStorageFile storage = IsolatedStorageFile.GetStore(
IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
string[] files = storage.GetFileNames(fileName);
foreach(string file in files) {
if(file == fileName) {
storage.DeleteFile(file);
break;
}
}
Вы все еще можете использовать обычный метод Path.GetTempFilename(), чтобы получить временный файл в сценариях ASP.NET.
Он должен дать вам путь к временному файлу, который может быть записан NETWORK_SERVICE, но также находится в одной из временных папок Windows, а не в папке вашего приложения.
Если ваш хост настроил свой сервер правильно, это должно работать нормально.
Файл web_mediumtrust.config по умолчанию, который поставляется Microsoft, общеизвестно непрактичен.
Вот фрагмент из файла web_mediumtrust.config по умолчанию. По умолчанию вы не можете использовать System.IO для обнаружения или записи во временную папку.
<IPermission
class="FileIOPermission"
version="1"
Read="$AppDir$"
Write="$AppDir$"
Append="$AppDir$"
PathDiscovery="$AppDir$"
/>
Хотя я не экспериментировал с изолированным хранилищем, о котором упоминал @Seb, похоже, он разрешен в файле конфигурации по умолчанию.
Это ответ Леппи, который прокомментировал мой вопрос (чтобы избежать лимита символов)
... иногда ваш пул приложений необъяснимо перезагружается без видимой причины. Обычно это проблема конфигурации или из-за того, что вы выполняете операции файловой системы в каталоге приложения.
Вы уверены, что он не должен утилизироваться?