在ASP.NET中实现文件下载时,如何处置文件流?

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

我看不到如何/在哪里可以处置它。

这是我当前的代码,该代码在MVC中执行下载" title="文件下载">文件下载:

using (DocumentGenerator dg = DocumentGenerator.OpenTemplate(path))

{

/* some document manipulation with the

DocumentGenerator goes here ...*/

return File(dg.GetDocumentStream(), "text/plain", filename);

}

由于流在控制器完成处理之前已关闭/处理,因此会出现此错误。在这种情况下,如何确保我的资源得到适当处置?

我的实现IDisposable只是配置MemoryStream。我知道这不是一个正确的实现,我只是将其用作测试。为了使它正常工作,我可以做些别的什么吗?

public void Dispose()

{

_ms.Dispose();

_ms = null;

}

回答:

您无需处置流。它将由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)从控制器调用时,它会调用构造函数,该构造函数将流存储到一个公共属性中,该属性在渲染过程中被处置。

结论:您无需担心使用来配置获得的流dg.GetDocumentStream()

以上是 在ASP.NET中实现文件下载时,如何处置文件流? 的全部内容, 来源链接: utcz.com/qa/406282.html

回到顶部