在ASP.NET中实现文件下载时如何处理文件stream?

我有一个包装一个MemoryStream的类DocumentGenerator 。 所以我已经在类上实现了IDisposable

我看不出我可以怎样处置它。

这是我目前的代码,它在MVC中执行文件下载:

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

在控制器结束之前,stream的这个错误是closures/处理的。 在这种情况下,我怎样才能确保资源妥善处置?

编辑:我现在的IDisposable实现只是configurationMemoryStream 。 我知道这不是一个正确的实现,我只是用它作为一个testing。 有什么不同,我可以在这里做,使其工作?

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

你不需要处理stream。 它将由FileStreamResult.WriteFile方法处理。 代码摘录自这个类:

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

注意using 。 当你从你的控制器调用File(dg.GetDocumentStream(), "text/plain", filename) ,调用存储stream的构造函数到在渲染过程中被放置的公共属性中。

结论:您不必担心configuration使用dg.GetDocumentStream()获取的stream。

为了补充Darin所说的 ,重要的是要注意这个概念:

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

不pipe在方法中如何使用它,using块都会确保始终调用Dispose,因此当您考虑将using块的结果用作return语句时,这一点很重要,它不会阻止它处置。 …