Armazenar arquivos de usuários temporários em ASP.NET em confiança média
-
07-07-2019 - |
Pergunta
Eu tenho um cenário onde os usuários de minha aplicação web ASP.NET enviar depoimentos que consistem em informações de texto e imagens. O processo de enviar possui as seguintes etapas:
- Primeiro o usuário entradas do conteúdo e escolhe um caminho para uma imagem
- Quando ele clica pré-visualização, a informação é mais uma vez mostrado para que ele possa confirmar
- Uma vez confirmada a informação é mantido no banco de dados
O problema com isso é que eu não quero para armazenar imagens carregadas no DB antes que o usuário realmente confirma. Em vez disso eu armazená-los como arquivos temporários e colocá-los em DB somente após a confirmação final.
Desde que eu também quero meu aplicativo para ser executado em meio confiança, tenho permissões de gravação única para o diretório do aplicativo e em nenhum lugar fora. Eu ainda quero permissões limite de gravação para o utilizador do serviço ASPNET / rede para a pasta ~ / App_Data. O problema com o meu cenário é que uma vez que um arquivo temporário é criado nessa pasta, o pool de aplicativos é reciclado e eu não quero que em cada depoimento enviar.
Como você aconselhar I manter estes arquivos temporários em vez disso? A piscina não é reiniciado se eu atualizar um arquivo - apenas em criar ou renomear. Mas eu não acho que pode armazenar imagens inteiras em um único arquivo para todos os usuários. O que você acha?
Atualizar : Devo observar que eu estou usando um controle de terceiros para upload. Isso me dá acesso programático ao fluxo binário do conteúdo do arquivo após o upload, mas não posso manter isso depois de um segundo postback (o primeiro passo e postback realmente faz o upload).
Solução
Eu recomendaria IsolatedStorage . É uma espécie de pasta virtual.
Aqui está um trecho de um exemplo em 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();
Atualizar : Para limpar o seu arquivo simplesmente fazer isso:
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;
}
}
Outras dicas
O arquivo web_mediumtrust.config padrão que vem da Microsoft é notoriamente impraticável.
Aqui está um trecho do arquivo web_mediumtrust.config padrão. Por padrão, você não pode usar System.IO para descobrir ou gravação para a pasta Temp.
<IPermission
class="FileIOPermission"
version="1"
Read="$AppDir$"
Write="$AppDir$"
Append="$AppDir$"
PathDiscovery="$AppDir$"
/>
Embora eu não tenha experirement com armazenamento isolado como mencionado por @Seb, parece ser permitido pelo arquivo de configuração padrão.
Você ainda pode usar o Path.GetTempFileName () para obter um arquivo temporário em cenários ASP.NET.
Deve dar-lhe um caminho de arquivo temporário que é gravável por NETWORK_SERVICE mas também vive em uma das pastas temporárias do Windows real, e não a pasta do aplicativo.
Se o seu host configurado seu servidor corretamente, que deve funciona bem.
Esta é uma resposta a leppie que comentou sobre a minha pergunta (para evitar o limite de caracteres)
... às vezes o seu pool de aplicativos recicla inexplicavelmente sem nenhum motivo aparente. Isso geralmente é um problema de configuração ou devido ao fato de que você está executando operações do sistema de arquivos no diretório do aplicativo.
Você tem certeza que não é suposto para reciclar?