Хранение временных пользовательских файлов в 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, похоже, он разрешен в файле конфигурации по умолчанию.

Это ответ Леппи, который прокомментировал мой вопрос (чтобы избежать лимита символов)

От: http://blogs.msdn.com/johan/archive/2007/05/16/common-reasons-why-your-application-pool-may-unexpectedly-recycle.aspx

... иногда ваш пул приложений необъяснимо перезагружается без видимой причины. Обычно это проблема конфигурации или из-за того, что вы выполняете операции файловой системы в каталоге приложения.

Вы уверены, что он не должен утилизироваться?

Другие вопросы по тегам