我试图提示可下载的文本文件(.txt),但出现此错误:
无法访问关闭的流。
我在这里查看了类似的问题:无法访问关闭的流 https://stackoverflow.com/questions/2331675/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()
or .Dispose()
其中任何一个都会处理整个流。在这种情况下,包裹MemoryStream
in a StreamWriter
意味着当using
语句完成StreamWriter
and MemoryStream
两者均已处置。
我的猜测是因为你要返回一个FileStreamResult
封装的File
不再使用流后将为您关闭流。在这种情况下,您不想使用using
声明并希望在返回流时保持流打开。
UPDATE
由于流是前向访问,因此您需要将流返回到开头以允许读回数据。
stream.Seek(0, SeekOrigin.Begin);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)