Domanda

Ho uno scenario in cui gli utenti della mia applicazione Web ASP.NET inviano testimonianze costituite da informazioni e immagini di testo. Il processo di invio prevede i seguenti passaggi:

  • Innanzitutto l'utente inserisce il contenuto e sceglie un percorso per un'immagine
  • Quando fa clic su Anteprima, le informazioni vengono nuovamente visualizzate in modo che possa confermare
  • Una volta confermate le informazioni persistono nel database

Il problema è che non voglio archiviare le immagini caricate nel DB prima che l'utente confermi effettivamente. Invece li memorizzo come file temporanei e li inserisco nel DB solo dopo la conferma finale.

Poiché voglio anche che la mia applicazione venga eseguita con attendibilità media, ho i permessi di scrittura solo sulla directory dell'applicazione e da nessuna parte all'esterno. Voglio anche limitare le autorizzazioni di scrittura per l'utente ASPNET / NETWORK SERVICE alla cartella ~ / App_Data. Il problema con il mio scenario è che una volta creato un file temporaneo in questa cartella, il pool di applicazioni viene riciclato e non lo voglio su ogni invio di testimonianze.

Come mi consiglia di conservare questi file temporanei? Il pool non viene riavviato se aggiorno un file, solo al momento della creazione o della ridenominazione. Ma non penso di poter memorizzare intere immagini in un unico file per tutti gli utenti. Cosa ne pensi?

AGGIORNAMENTO : dovrei notare che sto usando un controllo di terze parti per il caricamento. Mi dà accesso programmatico al flusso binario del contenuto del file dopo il caricamento, ma non posso mantenerlo dopo un secondo postback (il primo passaggio e il postback eseguono effettivamente il caricamento).

È stato utile?

Soluzione

Consiglierei IsolatedStorage . È una specie di cartella virtuale.

Ecco un estratto da un esempio su 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();

AGGIORNAMENTO : per ripulire il tuo file, procedi nel seguente modo:

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;
    }
}

Altri suggerimenti

Il file web_mediumtrust.config predefinito fornito da Microsoft è notoriamente poco pratico.

Ecco uno snippet dal file web_mediumtrust.config predefinito. Per impostazione predefinita, non è possibile utilizzare System.IO per rilevare o scrivere nella cartella temporanea.

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

Anche se non ho sperimentato l'archiviazione isolata come indicato da @Seb, sembra essere consentito dal file di configurazione predefinito.

Puoi comunque utilizzare il normale Path.GetTempFilename () per ottenere un file temporaneo negli scenari ASP.NET.

Dovrebbe darti un percorso di file temporaneo che è scrivibile da NETWORK_SERVICE ma che risiede anche in una delle cartelle temporanee di Windows, non nella cartella dell'applicazione.

Se il tuo host ha configurato correttamente il suo server, dovrebbe funzionare bene.

Questa è una risposta a Leppie che ha commentato la mia domanda (per evitare il limite del carattere)

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

  

... a volte il pool di applicazioni ricicla inspiegabilmente senza una ragione ovvia. Questo di solito è un problema di configurazione o dovuto al fatto che si stanno eseguendo operazioni sul file system nella directory dell'applicazione.

Sei sicuro che non debba riciclare?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top