我正在try 编写一个方法,该方法将读取ZIP文件中的所有CSV文件,该文件作为IFormFileHttpRequest提交.

我使用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的第二次迭代中,当它达到var dataReader = new CsvDataReader(csv)时,我得到了System.ObjectDisposedException: 'Cannot access a closed file.'.

我不清楚它认为是哪个"文件"被处理了.如何在整个循环中保持该流的打开状态?

这是在从ApiControlleremits 的Task<>内部运行的.

推荐答案

  • 这是在从ApiControlleremits 的Task<>内部运行的.
  • 你在等任务吗?
  • 我不是

当请求处理结束时(即执行动作结果并将响应发送到客户端时),ASP.NET将自动处理请求数据,包括请求正文,从而导致由IFormFile.OpenReadStream返回的流也被处理.由于您不是在等待处理任务,因此请求处理可以在任务之前完成,因此出现了例外.

您需要等待处理流的任务,或者下载所有数据(到内存中或在某种临时文件中)并"离线"处理它(通过任务或某种后台工作者管道-参见Background tasks with hosted services in ASP.NET CoreQuartz.NETHangfire).

Csharp相关问答推荐

获取Windows和Linux上的下载文件夹

当MD5被废弃时,如何在Blazor WASM中使用它?

使用C#中的Shape API从Azure目录获取所有用户

. NET 8 HttpClient post参数将其情况更改为camel'

HttpContext. RequestAborted当Android APP失go 连接时未取消

如何将此方法参数化并使其更灵活?

如何使用EF Core和.NET 8来upsert到具有多对多关系的表?

持有者安全定义未显示在Swagger.NET 8中

C#使用TextFieldParser读取.csv,但无法使用";0";替换创建的列表空条目

C#中浮点数的System.Text.Json序列化问题

如何管理Azure认证客户端响应和证书 fingerprint

LINQ to Entities中的加权平均值

有没有更好的方法来在CosmosDB上插入非id?

Blazor Fluent UI DialogService,<;FluentDialogProvider/>;错误

Azure Functions v4中的Serilog控制台主题

在扩展方法中,IEnumerable<;T>;不会转换为IEumerable<;T&>

序列化过程中的死循环

如何在使用Google.Drive.apis.V3下载文件/文件夹之前压缩?

如何使ExecuteAsync异步运行

在c#中,使用Okta和Blazor时,LocalReDirect()陷入循环,出现错误&请求太多.