遍历ZIP中CSV文件时CsvHelper第二次迭代抛出ObjectDisposedException
问题分析与解决方案
问题原因
你遇到的System.ObjectDisposedException异常,根源在于IFormFile.OpenReadStream()返回的流是绑定到请求上下文的临时文件流,其生命周期受ASP.NET Core请求处理机制限制。第一次处理ZIP条目后,该底层流可能被意外关闭,导致第二次迭代时无法访问ZIP文件内容。
修复代码
将ZIP文件内容先复制到内存流中,脱离对原始请求流的依赖,即可解决该问题:
using (var memoryStream = new MemoryStream()) { await zip.CopyToAsync(memoryStream); memoryStream.Position = 0; // 重置流指针到起始位置 using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Read, leaveOpen: true)) { foreach (var entry in archive.Entries) { // 跳过非CSV格式的条目 if (!entry.Name.EndsWith(".csv", StringComparison.OrdinalIgnoreCase)) continue; using (var entryStream = entry.Open()) using (var 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); // 在此处理读取到的CSV数据 } } } } }
关键改动说明
- 内存流中转:将IFormFile的流复制到
MemoryStream,确保ZIP文件内容完全加载到内存,不受原始请求流的生命周期影响。 - ZipArchive参数配置:初始化
ZipArchive时指定leaveOpen: true,避免ZipArchive释放时关闭内存流(内存流自身的using块会最终处理释放)。 - 过滤非CSV文件:增加格式判断,跳过ZIP内的非CSV条目,避免无效处理。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

