首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ASP.NET中实现文件下载时,如何处理我的文件流?

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

Stack Overflow用户
提问于 2010-06-21 19:53:44
回答 2查看 11.8K关注 0票数 24

我有一个包装MemoryStreamDocumentGenerator类。所以我在这个类上实现了IDisposable

不过,我不知道如何/在哪里可以处理它。

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

代码语言:javascript
复制
using (DocumentGenerator dg = DocumentGenerator.OpenTemplate(path))
{
    /* some document manipulation with the 
       DocumentGenerator goes here ...*/

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

这个错误是因为流在控制器完成之前被关闭/释放。在这种情况下,我如何确保我的资源得到了正确的处理?

编辑:目前我的IDisposable实现只处理MemoryStream。我知道这不是一个正确的实现,我只是将其用作测试。这里有没有什么我可以做的不一样的事情来让它工作?

代码语言:javascript
复制
public void Dispose()
{
    _ms.Dispose();
    _ms = null;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-22 00:06:01

您不需要处理流。它将由FileStreamResult.WriteFile方法处理。这个类的代码摘录:

代码语言:javascript
复制
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()处理获得的流。

票数 34
EN

Stack Overflow用户

发布于 2010-06-23 14:20:53

为了补充Darin has said,重要的是要注意这个概念:

代码语言:javascript
复制
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);
  }
}

不管你如何在你的方法中使用它,using块确保Dispose总是被调用,当你考虑使用using块的结果作为返回语句时,这一点很重要,它不会阻止它被释放……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3084366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档