Хранение временных пользовательских файлов в ASP.NET со средним доверием - PullRequest
5 голосов
/ 07 ноября 2008

У меня есть сценарий, когда пользователи моего веб-приложения ASP.NET отправляют отзывы, содержащие текстовую информацию и изображения. Процесс отправки состоит из следующих шагов:

  • Сначала пользователь вводит контент и выбирает путь к изображению
  • Когда он нажимает кнопку предварительного просмотра, информация снова отображается, чтобы он мог подтвердить
  • После подтверждения информация сохраняется в базе данных

Проблема в том, что я не хочу сохранять загруженные изображения в БД до того, как пользователь фактически подтвердит. Вместо этого я храню их как временные файлы и помещаю в БД только после окончательного подтверждения.

Поскольку я также хочу, чтобы мое приложение работало со средним доверием, у меня есть права на запись только в каталог приложения и нигде вне его. Я даже хочу ограничить права на запись для пользователя ASPNET / NETWORK SERVICE в папку ~ / App_Data. Проблема моего сценария заключается в том, что после создания временного файла в этой папке пул приложений перерабатывается, и я не хочу этого при каждой отправке отзыва.

Как вы посоветуете мне вместо этого хранить эти временные файлы? Пул не перезапускается, если я обновляю файл - только при создании или переименовании. Но я не думаю, что могу хранить целые изображения в одном файле для всех пользователей. Что ты думаешь?

ОБНОВЛЕНИЕ : Должен заметить, что для загрузки я использую сторонний элемент управления. Это дает мне программный доступ к двоичному потоку содержимого файла после загрузки, но я не могу сохранить его после второй обратной передачи (первый шаг и обратная передача фактически выполняют загрузку).

Ответы [ 4 ]

5 голосов
/ 07 ноября 2008

Я бы порекомендовал 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;
    }
}
2 голосов
/ 09 ноября 2008

Файл web_mediumtrust.config по умолчанию, который поставляется Microsoft, общеизвестно непрактичен.

Вот фрагмент из файла web_mediumtrust.config по умолчанию. По умолчанию вы не можете использовать System.IO для обнаружения или записи во временную папку.

                        <IPermission
                                class="FileIOPermission"
                                version="1"
                                Read="$AppDir$"
                                Write="$AppDir$"
                                Append="$AppDir$"
                                PathDiscovery="$AppDir$"
                        />

Хотя я не экспериментировал с изолированным хранилищем, как упомянуто @Seb, похоже, это разрешено файлом конфигурации по умолчанию.

2 голосов
/ 07 ноября 2008

Вы по-прежнему можете использовать обычный Path.GetTempFilename () для получения временного файла в сценариях ASP.NET.

В нем должен быть указан путь к временному файлу, который может быть записан NETWORK_SERVICE, но который также находится в одной из временных папок Windows, а не в папке приложения.

Если ваш хост настроил свой сервер правильно, это должно работать нормально.

0 голосов
/ 07 ноября 2008

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

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

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

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

...