【发布时间】:2023-03-13 23:29:01
【问题描述】:
我在找到正确的咒语时遇到了一些麻烦,该咒语允许我写入响应流,然后在测试中读取内容。目前我有这个
var res = new HttpResponseMessage(System.Net.HttpStatusCode.OK);
var ms = new MemoryStream();
res.Content = new StreamContent(ms);
using (var sw = new StreamWriter(ms, System.Text.Encoding.UTF8))
using (var csv = new CsvHelper.CsvWriter(sw))
csv.WriteRecords(allData.ToList());
return res;
在我的测试中,我正在尝试阅读此响应
var controller = appContainer().Resolve<MyController>();
var res = (await controller.Get()) as HttpResponseMessage;
res.ShouldNotEqual(null);
var csv = await res.Content.ReadAsStringAsync();
最后一行产生错误
Error while copying content to a stream.
----> System.ObjectDisposedException : Cannot access a closed Stream.
所以这里有几件事
- 为什么会发生此错误,如何在测试中正确防止它发生?
-
MemoryStream的使用不适合我,我不应该能够直接写入内容流吗?MemoryStream是不是可能会极大地增加我的内存使用量?
【问题讨论】:
-
using语句导致流被释放。 -
没有不加倍内存使用。内容的流是您分配给它的流。检查源代码
-
@Nkosi 所以假设我正在写 10MB 的 CSV。我需要 10MB 的内存块来缓冲这些。但是坚持住!我可以在不将整个 csv 渲染到内存的情况下开始发回身体的某些部分,因此我不会实际上一次需要整个 10MB,而是需要一个更小的移动窗口。这就是你对
FileStreamResult所做的事情,我想在这里获得类似的效率。 -
@GeorgeMauer 你有没有找到解决方案?您在 question 中制作了类似的 cmets,但没有发布解决方案。
-
@Nse 刚刚检查了我最终做了什么,实际上我确实使用了内存流。我不太确定这是一个 asp.net web api 问题,但是 - 这可能是一个
CsvHelper错误,因为处理CsvWriter会关闭底层流。未来的版本可以选择不这样做,但我已经查看了代码和我正在使用的版本(2.16.3.0),实际上可以保留未处理、刷新流写入器并重置内存流位置
标签: c# asp.net-web-api stream