You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:02:31