c# - 在 ASP MVC 3 中创建可下载的文本文件时无法访问已关闭的流

标签 c# asp.net-mvc-3 asp.net-mvc

我试图提示可下载的文本文件 (.txt),但出现此错误:

Cannot access a closed Stream.

我在这里查看了类似的问题: Cannot Access Closed Stream 但它不是很有用。

这是我的代码:

    private FileStreamResult Export()
    {
        string name = "filename.txt";

        MemoryStream stream = new MemoryStream();
        using (StreamWriter writer = new StreamWriter(stream))
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("A text...");
            writer.WriteLine(sb.ToString());
        }

        return File(stream, "text/plain", name);
    }

更新(工作副本):

这给了我一个空白文本文件。

private FileResult Export()
{
    string name = "filename.txt";

    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);

    StringBuilder sb = new StringBuilder();
    sb.Append("A text...");
    writer.WriteLine(sb.ToString());

    writer.Flush();
    stream.Seek(0, SeekOrigin.Begin);

    return File(stream, "text/plain", name);
}

最佳答案

这是正确的,当您将一个流包装在另一个流中时,对它们中的任何一个调用 .Close().Dispose() 都会释放整个流。在这种情况下,将 MemoryStream 包装在 StreamWriter 中意味着当 using 语句完成 StreamWriterMemoryStream 都被释放了。

我的猜测是,因为您要返回一个 FileStreamResult,封装 File 将在流不再使用后为您关闭该流。在这种情况下,您不想使用 using 语句,并且希望在返回流时保持打开状态。

更新

由于流是前向访问,您需要看到流回到开头以允许数据被读回。

stream.Seek(0, SeekOrigin.Begin);

关于c# - 在 ASP MVC 3 中创建可下载的文本文件时无法访问已关闭的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7152586/

相关文章:

jquery - 在 ASP.Net MVC 中,ModelState 可以与 ajax 更新一起使用吗?

c# - 如何在 WebApi 中使用多个 GET 操作?

c# - Quartz.NET 连接-事务对不能为空

c# - 如何编写一个将不同类型作为参数的泛型方法?

asp.net - 如何在 Asp.net MVC 中使用代码优先方法更新模型和数据库

validation - 在ASP.NET MVC 3中,AllowEmptyString = true的RequiredAttribute

asp.net-mvc-3 - ASP.NET MVC3 和 ajax 问题

JavaScript 在我建议之前就加载了

c# - 只删除 c# 上的一些 html 标签

c# - 如何在 wpf xaml 文件中添加多行注释?