Domanda

Nota che non sto parlando dei file ASP.NET temporanei generati dal compilatore " ;.

La mia applicazione Web (ASP.NET MVC) utilizza Graphviz per generare immagini che vengono quindi inviate al client. Ciò richiede la creazione di file temporanei.

Qual è il modo migliore per gestirli? C'è un modo per eliminarli immediatamente dopo l'invio? Dovrei usare un thread in background? Qualcosa in Application_Start o Application_End?

È stato utile?

Soluzione

non puoi farlo tramite un controller o utilizzare un ASHX ( http://www.marklio.com/marklio/CommentView,guid,df8d6471-83fd-4f66-a799-ef8274979f0e.aspx ) per eseguire lo streaming del contenuto ed eliminare i file temporanei una volta hai finito di scrivere il flusso?

Altri suggerimenti

Graphviz crea il client e li aggiunge come collegamento nella pagina. quindi non puoi eliminarli direttamente.

ci sono diversi modi:

  • all'avvio dell'applicazione, nessuno dovrebbe usare una di queste immagini. così puoi eliminarlo
  • aggiungi un riferimento all'immagine (ad es. il percorso) nella cache e aggiungi un CacheItemRemovedCallback, che eliminerà l'immagine. (limita piacevolmente la quantità di immagini sul tuo HD
  • crea un timer, che elimina periodicamente gli oggetti

tieni presente che non dovresti eliminare le immagini create solo un secondo fa. a causa loro possono essere utilizzati.

Utilizza il metodo descritto da un altro utente ma chiedi al browser di utilizzare la sua cache se desidera di nuovo l'immagine impostando il Intestazione dell'ultima modifica nella risposta, quindi nel gestore dell'immagine se si ottiene un Intestazione If-Modified-Since, il gestore deve rispondere con StatusCode 304 "NON modificato" in questo modo l'immagine è ancora visualizzata fintanto che il browser client non ha cancellato la sua cache.

Mi piace gestire i file temporanei creati da un'azione nella stessa azione che li genera. Ad esempio: (in MVC, ma questo potrebbe applicarsi a qualsiasi framework)

public ActionResult Foo()
{
    FooCleanup(); // deletes files in "~/temp/Foo/" older than a day or so

    string filename = CreateTemporaryFile(); // Creates a temporary file like "~/temp/Foo/{timestamp}.foo"
    return File(filename);
}

Se Foo () viene chiamato molto, puoi aggiungere un po 'di logica per chiamare cleanup ogni tanto. È un po 'come il cron job di un povero, ma funziona bene.

usiamo application_start con una specie di timer da eseguire a intervalli di 24 ore e ripuliamo / eliminiamo la cartella dei file temporanei una volta al giorno.

È possibile creare un gestore (.ashx) e trasmettere il file temporaneo attraverso quello. In questo modo saprai che il file è stato trasferito al client e puoi eliminare il file temporaneo alla fine del gestore.

Un possibile problema è che il client non sarà in grado di scaricare il file due volte, poiché lo si elimina immediatamente. (Che potrebbe quindi essere mitigato utilizzando la cache di output della pagina ...)

Sebbene la cosa migliore sarebbe se tu potessi evitare il problema del file temporaneo ovunque , e eseguire lo streaming del file su richiesta, generandolo nel gestore ...

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