Хранение временных пользовательских файлов в ASP.NET на уровне среднего доверия
-
07-07-2019 - |
Вопрос
У меня есть сценарий, в котором пользователи моего веб-приложения отправляют отзывы, состоящие из текстовой информации и изображений. ASP.NET веб-приложение отправляет отзывы, состоящие из текстовой информации и изображений.Процесс отправки состоит из следующих шагов:
- Сначала пользователь вводит содержимое и выбирает путь к изображению
- Когда он нажимает предварительный просмотр, информация снова отображается, чтобы он мог подтвердить
- После подтверждения информация сохраняется в базе данных
Проблема с этим заключается в том, что я не хочу сохранять загруженные изображения в базе данных до фактического подтверждения пользователем.Вместо этого я сохраняю их как временные файлы и помещаю в базу данных только после окончательного подтверждения.
Поскольку я также хочу, чтобы мое приложение запускалось со средним уровнем доверия, у меня есть разрешения на запись только в каталог приложения и нигде за его пределами.Я даже хочу ограничить права на запись для пользователя ASPNET / NETWORK SERVICE папкой ~/App_Data.Проблема с моим сценарием заключается в том, что после создания временного файла в этой папке пул приложений перерабатывается, а я не хочу, чтобы это происходило при каждой отправке отзыва.
Как вы советуете мне сохранить эти временные файлы вместо этого?Пул не перезапускается, если я обновляю файл - только при создании или переименовании.Но я не думаю, что смогу хранить целые изображения в одном файле для всех пользователей.А ты как думаешь?
Обновить:Я должен отметить, что я использую сторонний элемент управления для загрузки.Это дает мне программный доступ к двоичному потоку содержимого файла после загрузки, но я не могу сохранить это после второй обратной передачи (первый шаг и обратная передача фактически выполняют загрузку).
Решение
Я бы порекомендовал Изолированное хранилище.Это своего рода виртуальная папка.
Вот выдержка из пример в 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;
}
}
Другие советы
Файл web_mediumtrust.config по умолчанию, поставляемый Microsoft, заведомо непрактичен.
Вот фрагмент из файла web_mediumtrust.config по умолчанию.По умолчанию вы не можете использовать System.Ввод-вывод для обнаружения или записи во временную папку.
<IPermission
class="FileIOPermission"
version="1"
Read="$AppDir$"
Write="$AppDir$"
Append="$AppDir$"
PathDiscovery="$AppDir$"
/>
Хотя у меня не было опыта работы с Изолированным хранилищем, как упоминалось @Seb, похоже, это разрешено конфигурационным файлом по умолчанию.
Вы все еще можете использовать обычный Path.GetTempFilename() способ получения временного файла в ASP.NET сценариях.
Он должен указать вам путь к временному файлу, который доступен для записи с помощью NETWORK_SERVICE, но также находится в одной из реальных временных папок Windows, а не в папке вашего приложения.
Если ваш хост правильно настроил свой сервер, это должно работать нормально.
Это ответ Леппи, которая прокомментировала мой вопрос (чтобы избежать ограничения на количество символов)
...иногда ваш пул приложений необъяснимым образом перерабатывается без видимой причины.Обычно это проблема конфигурации или связано с тем, что вы выполняете операции с файловой системой в каталоге приложения.
Вы уверены, что его не нужно перерабатывать?