我正在尝试编写一种方法,该方法将从 ZIP 文件中读取通过
IFormFile
作为 HttpRequest
提交的所有 CSV 文件。
我正在使用
CsvHelper
使用以下代码读取文件内容:
using (var archiveStream = zip.OpenReadStream())
{
using (var archive = new ZipArchive(archiveStream))
{
foreach (var entry in archive.Entries)
{
using (var entryStream = entry.Open())
{
using (TextReader reader = new StreamReader(entryStream))
{
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
using (var dataReader = new CsvDataReader(csv))
{
while (dataReader.Read())
{
object[] values = new object[dataReader.FieldCount];
dataReader.GetValues(values);
// do stuff with object[]
}
}
}
}
}
}
}
}
但是,在
foreach
的第二次迭代中,当到达 System.ObjectDisposedException: 'Cannot access a closed file.'
时,我得到 var dataReader = new CsvDataReader(csv)
。
我不清楚它认为哪个“文件”已被处理。如何在整个循环中保持该流打开?
可能相关的信息: 这是在从
Task<>
启动的 ApiController
内运行。
- 它在从 ApiController 启动的 Task<> 内运行。
- 你在等待任务吗?
- 我不是
当请求完成时,ASP.NET 将自动处理请求数据,包括请求正文,从而导致
IFormFile.OpenReadStream
返回的流也被处理。您需要等待处理流的任务,或者下载所有数据(到内存或某种临时文件中)并启动“离线”处理(通过任务或某种后台工作管道)。