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

fea*_*net 21 c# asp.net asp.net-mvc streaming idisposable

我有一个DocumentGenerator包装的课程MemoryStream.所以我已经IDisposable在课堂上实施了.

我看不出如何/在哪里可以处理它.

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

using (DocumentGenerator dg = DocumentGenerator.OpenTemplate(path))
{
    /* some document manipulation with the 
       DocumentGenerator goes here ...*/

    return File(dg.GetDocumentStream(), "text/plain", filename);
}
Run Code Online (Sandbox Code Playgroud)

在控制器完成之前关闭/处理流时出现此错误.在这种情况下,如何确保我的资源得到妥善处理?

编辑:我现在的执行IDisposable只是处置MemoryStream.我知道这不是一个正确的实现,我只是用它作为测试.有什么不同我可以在这里做它的工作吗?

public void Dispose()
{
    _ms.Dispose();
    _ms = null;
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 32

您不需要处理流.它将由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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意using.当您File(dg.GetDocumentStream(), "text/plain", filename)从控制器调用时,它会调用构造函数,该构造函数将流存储到在呈现期间处置的公共属性中.

结论:您不必担心处理获取的流dg.GetDocumentStream().

  • 如果您的流来自另一个可丢弃对象(如HttpWebResponse),该怎么办?我应该担心处理HttpWebResponse还是只是假设它将获取垃圾?示例`var response =(HttpWebResponse)request.GetResponse(); 返回File(response.GetResponseStream(),“ image / JPEG”);` (3认同)