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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:27:25