Prima di tutto, I amore ASP.NET MVC. Questa domanda non è una critica di ciò. Piuttosto, voglio confermare ciò che penso di vedere e assicurarmi di non aver perso qualcosa. Resta con me ... Non riesco ad arrivare alla domanda senza fornire un po 'di contesto.FileStreamResult di ASP.NET MVC è meno efficiente della scrittura diretta sul flusso di risposta in uscita o mi manca qualcosa?
La domanda ha a che fare con la restituzione dei dati in un flusso in risposta a un post HTTP. Nei giorni precedenti a ASP.NET MVC, è possibile eseguire questa operazione collegando i dati direttamente al flusso di risposta. Ad esempio, si potrebbe fare qualcosa di simile:
someObjectThatDumpsOutputToWhateverStreamYouHandIt.WriteTo(Response.OutputStream);
Avviso un aspetto fondamentale di questo codice: non ho implementato QUALSIASI archivio di backup. Non dovevo trasmettere le informazioni a un array di byte, né scaricarle in un file temporaneo. Piuttosto, ASP.NET aveva già impostato un flusso allo scopo di comunicare la risposta al browser e ho scaricato l'output che voglio direttamente in quel flusso. Questo è più efficiente in termini di CPU, memoria e tempo di esecuzione che copiare tutti i dati in una posizione temporanea e quindi spostarli nel flusso di risposta.
Tuttavia, non è molto amichevole ai test unitari. In effetti, puoi ancora fare quel tipo di codice in ASP.NET MVC, ma l'abitudine sarebbe quella di evitarlo. Piuttosto, ASP.NET MVC ti incoraggerebbe a restituire un ActionResult. ActionResult è un concetto ASP.NET MVC che esiste principalmente per essere un test unitario. Ti permette di "dichiarare" ciò che vuoi fare. Un test unitario può esercitare un'azione Controller e confermare che ottiene l'ActionResult previsto. Quel test unitario può essere eseguito al di fuori di un browser.
ASP.NET MVC offre un tipo di ActionResult per la restituzione di flussi di dati. Si chiama FileStreamResult. Non lasciare che la parola "File" nel nome ti inganni. Si tratta di restituire un flusso di dati, esattamente come stiamo parlando sopra.
Tuttavia, ecco il problema e la base della mia domanda: Se si rende il metodo Controller restituito un FileStreamResult e si passa a un Stream che si desidera restituire, allora sembra che non vi sia più alcun modo per a scaricare i dati direttamente nel flusso di risposta. Ora, sembra che tu sia costretto a creare il tuo stream con un backing store (come la memoria o un file), eseguire il dump dei tuoi dati in esso, e poi passarlo a FileStreamResult che tu restituisci.
Così sembra che devo fare qualcosa di simile (volutamente omettendo smaltire/utilizzando/ecc):
MemoryStream myIntermediateStream = new MemoryStream();
someObjectThatDumpsOutputToWhateverStreamYouHandIt.WriteTo(myIntermediateStream);
return new FileStreamResult(myIntermediateStream, "application/pdf");
noti che myIntermediateStream fa sì che il contenuto del grande flusso di dati da memorizzare nella memoria temporanea , in modo che FileStreamResult possa in seguito copiarlo nuovamente nel flusso di output di risposta.
Quindi, ecco la mia domanda: ho trascurato qualcosa, o è esatto dire che l'uso di FileStreamResult ti costringe ad avere un percorso di archiviazione intermedio che non saresti costretto ad avere se dovessi scrivere direttamente sull'output della Response lo streaming?
Grazie.
Jonathan, grazie per la correzione di errore. –