Imansible accedere a un stream chiuso durante la creazione di un file di testo scaricabile in ASP MVC 3

Sto cercando di richiedere un file di testo scaricabile (.txt), ma ottengo questo errore:

Imansible accedere a un stream chiuso.

Ho esaminato le domande simulate qui: Imansible accedere al stream chiuso, ma non è stato molto utile.

Ecco il mio codice:

private FileStreamResult Export() { string name = "filename.txt"; MemoryStream stream = new MemoryStream(); using (StreamWriter writer = new StreamWriter(stream)) { StringBuilder sb = new StringBuilder(); sb.Append("A text..."); writer.WriteLine(sb.ToString()); } return File(stream, "text/plain", name); } 

AGGIORNAMENTO (copia di lavoro):

Questo mi dà un file di testo vuoto.

 private FileResult Export() { string name = "filename.txt"; MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); StringBuilder sb = new StringBuilder(); sb.Append("A text..."); writer.WriteLine(sb.ToString()); writer.Flush(); stream.Seek(0, SeekOrigin.Begin); return File(stream, "text/plain", name); } 

È corretto, quando si avvolge un stream in un altro stream, chiamare .Close() o .Dispose() su uno di essi disporrà l’intero stream. In questo caso, il wrapping di MemoryStream in StreamWriter significa che quando l’istruzione using completa StreamWriter e MemoryStream sono entrambi eliminati.

La mia ipotesi è che, dal momento che si restituisce un FileStreamResult il File incapsulante chiuderà il stream per te dopo che lo stream non sarà più utilizzato. In questo caso, non si desidera utilizzare l’istruzione using e si vorrà lasciare lo stream aperto quando lo si restituisce.

AGGIORNARE

Poiché un stream è in fase di accesso, è necessario vedere lo stream di nuovo all’inizio per consentire la lettura dei dati.

 stream.Seek(0, SeekOrigin.Begin); 

Rimuovilo using istruzione – stai passando il riferimento object disposto al metodo File e questo è il motivo per cui ottieni un’eccezione. Da MSDN ,

L’object StreamWriter chiama Dispose sull’object Stream fornito quando viene chiamato StreamWriter.Dispose.

Credo che File stream da solo dopo l’uso (non verificato guardando il codice sorgente).

AGGIORNARE:

writer.Flush(); prima che la dichiarazione di ritorno ti possa aiutare

Devi impostare la posizione del memorystream a 0 prima di usarla nel tuo FileStreamResult, altrimenti verrà letta dalla posizione corrente (IE alla fine del stream).

 stream.Position = 0; return File(stream, "text/plain", name); 

Ho appena avuto la stessa cosa.

So che questo thread è antico, sperando solo di aiutare gli altri a fare lo stesso problema.

Sostituisci il tipo FileStreamResult nella tua azione con FileResult .