Sco*_*合理论 2 c# asp.net-mvc download stream
public ActionResult GetFile(string dateStr, string serverName, string foodName)
{
using (var memoStream = new MemoryStream(1024 * 5))
{
using (StreamWriter writer = new StreamWriter(memoStream))
{
var dataFilter = new CapacityDataFilter(dateStr, serverName, feedName);
dataFilter.FilterDataByServerAndFeed();
writer.WriteLine("Feed, StreamMin, TotalMsgNumber, TotalMsgSize, PeakRateMsgNumber, PeakRateMsgSize");
foreach (var element in dataFilter.DataInTheDay)
{
writer.WriteLine(string.Format("{0},{1},{2},{3},{4},{5}",
element.Feed, element.StreamMin,
element.TotalMsgNumber, element.TotalMsgSize,
element.PeakRateMsgNumber, element.PeakRateMsgSize));
}
return File(memoStream, "text/csv", fileName);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Exception Details: System.ObjectDisposedException: Cannot access a closed Stream.
这个动作不起作用,如何进行下载动作?
"这个行动不起作用"是解释问题的错误方法......
但在这种情况下,你很幸运:你试图在寻找到底的内存流中发送不完整的数据,并且因为第二个问题流将在文件操作实际执行时被处理.
最好的解决方法是移动代码outisde inner using并在旧流的缓冲区上返回新的MemoryStream:
using (var memoStream = new MemoryStream(1024 * 5))
{
using (StreamWriter writer = new StreamWriter(memoStream))
{
...
}
return File(
new MemoryStream(memoStream.GetBuffer(), memoStream.length),
"text/csv", fileName);
}
Run Code Online (Sandbox Code Playgroud)
当你立即使用流时,armen.shimoon提出的Flush + Seek也适用于其他情况:
writer.Flush();
memoStream.Flush();
memoStream.Position = 0;
// do something with MemoryStream right here before either of `using`ends.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3935 次 |
| 最近记录: |