¿Cómo elimino mi filestream al implementar una descarga de archivos en ASP.NET?

Tengo una clase DocumentGenerator que envuelve un MemoryStream . Así que he implementado IDisposable en la clase.

Sin embargo, no veo cómo / dónde puedo eliminarlo.

Este es mi código actual, que realiza una descarga de archivos en MVC:

 using (DocumentGenerator dg = DocumentGenerator.OpenTemplate(path)) { /* some document manipulation with the DocumentGenerator goes here ...*/ return File(dg.GetDocumentStream(), "text/plain", filename); } 

Estos errores a medida que la secuencia se cierra / desecha antes de que el controlador haya terminado con ella. ¿Cómo puedo asegurarme de que mis recursos se eliminen adecuadamente en esta situación?

EDITAR: Mi implementación de IDisposable en este momento solo dispone de MemoryStream . Sé que no es una implementación adecuada, solo la utilicé como prueba. ¿Hay algo diferente que pueda hacer aquí para que funcione?

 public void Dispose() { _ms.Dispose(); _ms = null; } 

No necesita deshacerse de la transmisión. Se eliminará mediante el método FileStreamResult.WriteFile . Extracto del código de esta clase:

 public FileStreamResult(Stream fileStream, string contentType) : base(contentType) { if (fileStream == null) { throw new ArgumentNullException("fileStream"); } this.FileStream = fileStream; } protected override void WriteFile(HttpResponseBase response) { Stream outputStream = response.OutputStream; using (this.FileStream) { byte[] buffer = new byte[0x1000]; while (true) { int count = this.FileStream.Read(buffer, 0, 0x1000); if (count == 0) { return; } outputStream.Write(buffer, 0, count); } } } 

Observe el using . Cuando llama a File(dg.GetDocumentStream(), "text/plain", filename) desde su controlador, esto invoca el constructor que almacena la secuencia en una propiedad pública que se desecha durante la representación.

Conclusión: no necesita preocuparse por eliminar la secuencia dg.GetDocumentStream() con dg.GetDocumentStream() .

Solo para agregar a lo que dijo Darin , es importante tener en cuenta este concepto:

 public Stream GetDownloadFile(...) { using (var stream = new MemoryStream()) { return stream; } } public Stream GetDownloadFile(...) { using (var generator = DocumentGenerator.OpenTemplate(path)) { // Document manipulation. return File(generator.GetDocumentStream(), "text/plain", filename); } } 

Independientemente de cómo lo esté usando en su método, el bloque que utiliza garantiza que siempre se llame a Dispose, esto es importante cuando considera usar el resultado del bloque que usa como statement de retorno, no evitará que se elimine. …