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 3.0 重大更改的影响。
从 ASP.NET Core 3.0 开始,同步服务器操作是 默认禁用。
更改描述
AllowSynchronousIO 是每个服务器中的一个选项 启用或禁用同步 IO API,例如
,HttpRequest.Body.Read
和HttpResponse.Body.Write
。这些API长期以来一直是 线程饥饿和应用程序挂起的根源。从 ASP.NET Core 开始 3.0 Preview 3,这些同步操作默认是禁用的。Stream.Flush
受影响的服务器:
- 红隼
- 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();
}