在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语句时,这一点很重要,它不会阻止它处置。 …
- 重新加载configuration,而无需使用ConfigurationManager.RefreshSection重新启动应用程序
- 为什么我应该使用int而不是一个字节或C#中的短
- OnclientClick和OnClick不在同一时间工作?
- 如何告诉RadioButtonList不生成一个表
- 如何将SVN版本号与我的ASP.NET网站同步?
- 如何使用jquery设置单选button选定的值
- 为什么我的ClaimsIdentity总是被authentication为false(对于web api授权filter)?
- 如何保护ASP.NET_SessionId cookie?
- 用于DropDownList的EditorTemplate