ASP.NET Core MVC中CsvReader读取Request.Body触发未处理异常
ASP.NET Core MVC中使用CsvReader读取Request.Body时的同步IO异常解决办法
异常信息
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默认禁用同步IO操作以避免阻塞线程池,改用CsvHelper的异步API并将Action改为异步方法即可解决:
[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 = await csv.GetRecordsAsync<Operationlog>().ToListAsync(); } return Ok(); }
说明:GetRecordsAsync和ToListAsync是CsvHelper提供的异步方法,配合async/await符合ASP.NET Core异步编程模型,不会触发同步IO限制。
方案二:启用AllowSynchronousIO(兼容旧代码场景)
如果无法修改为异步逻辑,可在服务配置中开启同步IO支持。注意此方案会影响应用性能和可伸缩性,仅作为临时兼容方案:
ASP.NET Core 6+(Program.cs)
var builder = WebApplication.CreateBuilder(args); // 配置IIS和Kestrel允许同步IO builder.Services.Configure<IISServerOptions>(options => { options.AllowSynchronousIO = true; }); builder.Services.Configure<KestrelServerOptions>(options => { options.AllowSynchronousIO = true; }); builder.Services.AddControllersWithViews(); var app = builder.Build(); // 其他中间件配置... app.Run();
ASP.NET Core 3.x/5(Startup.cs)
public void ConfigureServices(IServiceCollection services) { services.Configure<IISServerOptions>(options => { options.AllowSynchronousIO = true; }); services.Configure<KestrelServerOptions>(options => { options.AllowSynchronousIO = true; }); services.AddControllersWithViews(); }
内容的提问来源于stack exchange,提问作者Teppei Abe
相关产品推荐
相关产品推荐

