CsvReader无法读取Asp.net core MVC中的Request.Body

问题描述 投票:0回答:1

CsvReader 从 Asp.net core MVC 中的请求正文读取流发生未处理的异常。

■异常

Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware: 错误:执行时发生未处理的异常 请求。

System.InvalidOperationException:同步操作是 不允许。改为调用 ReadAsync 或将 AllowSynchronousIO 设置为 true。

[ActionName("SaveLog")]
[HttpPost]
public IActionResult SaveLog([FromHeader] HeaderDTO headerDTO)
{

    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        //ヘッダを出力しないように指定
        HasHeaderRecord = false,
    };

    using (var reader = new StreamReader(Request.Body))
    using (var csv = new CsvReader(reader, config))
    {
        var records = csv.GetRecords<Operationlog>().ToList();
    }

    return Ok();
}
asp.net-core csvhelper
1个回答
0
投票

您正在受到 ASP.NET Core 3.0 重大更改的影响。

HTTP:在所有服务器中禁用同步 IO

从 ASP.NET Core 3.0 开始,同步服务器操作是 默认禁用。

更改描述

AllowSynchronousIO 是每个服务器中的一个选项 启用或禁用同步 IO API,例如

HttpRequest.Body.Read
HttpResponse.Body.Write
Stream.Flush
。这些API长期以来一直是 线程饥饿和应用程序挂起的根源。从 ASP.NET Core 开始 3.0 Preview 3,这些同步操作默认是禁用的。

受影响的服务器:

  • 红隼
  • HttpSys
  • IIS 进程中
  • 测试服务器

预计会出现类似于以下内容的错误:

  • 不允许同步操作。改为调用 ReadAsync 或将 AllowSynchronousIO 设置为 true。
  • 不允许同步操作。改为调用 WriteAsync 或将 AllowSynchronousIO 设置为 true。
  • 不允许同步操作。改为调用 FlushAsync 或将 AllowSynchronousIO 设置为 true。

每个服务器都有一个AllowSynchronousIO选项来控制这个 行为和所有这些的默认值现在都是 false。

CsvHelper 已经解决了这个问题,将控制器方法转换为异步,只需调用 CsvHelper 中该方法的异步等效方法:

[ActionName("SaveLog")]
[HttpPost]
public async Task<IActionResult> SaveLog([FromHeader] HeaderDTO headerDTO)
{

    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        //ヘッダを出力しないように指定
        HasHeaderRecord = false,
    };

    using (var reader = new StreamReader(Request.Body))
    using (var csv = new CsvReader(reader, config))
    {
        var records = csv.GetRecordsAsync<Operationlog>();
        await foreach (var record in records)
        {
            //iterate through your records
        }
    }

    return Ok();
}
© www.soinside.com 2019 - 2024. All rights reserved.