一尘不染

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

c#

我有一个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);
}

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

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

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

阅读 397

收藏
2020-05-19

共1个答案

一尘不染

您无需处置流。它将由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()

2020-05-19