我试图提示可下载的文本文件 (.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
语句完成 StreamWriter
和 MemoryStream
都被释放了。
我的猜测是,因为您要返回一个 FileStreamResult
,封装 File
将在流不再使用后为您关闭该流。在这种情况下,您不想使用 using
语句,并且希望在返回流时保持打开状态。
更新
由于流是前向访问,您需要看到流回到开头以允许数据被读回。
stream.Seek(0, SeekOrigin.Begin);
关于c# - 在 ASP MVC 3 中创建可下载的文本文件时无法访问已关闭的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7152586/