在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