当前位置: 首页 > 知识库问答 >
问题:

ASP。NET核心:不允许同步操作。调用WriteAsync或将AllowSynchronousIO改为true

周承天
2023-03-14

ASP. NET核心服务器,AllowSynChronousIO设置为false

        new WebHostBuilder()
        .UseKestrel(options =>
        {
            options.AllowSynchronousIO = false;
        })

在操作中,它输出一个JsonResult

    public async Task<IActionResult> SanityCheck()
    {
        Dictionary<string, string> dic = await GetDic();

        return this.Json(dic);
    }

它以一个例外结束

系统。无效操作异常:不允许同步操作。改为调用WriteAsync或将AllowSynChronousIO设置为true。

我不能返回允许同步IO为false的JsonResult吗?

共有3个答案

韦棋
2023-03-14

我在单元测试中遇到了这个问题。我必须将我的TestServer更新为AlloSynchronousIO

Server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
Server.AllowSynchronousIO = true;
白子默
2023-03-14

当异常抛出在您无法控制的代码中,并且您除了启用AllowSynChronousIO之外别无选择时,最好针对特定请求而不是全局启用它。

在发布此功能的GitHub版本中,建议采用以下解决方法:

var syncIOFeature = HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
    syncIOFeature.AllowSynchronousIO = true;
}

您可以创建一个简单的中间件函数,将其应用于特定请求:

app.Use(async (context, next) =>
{
    if (context.Request.Path.StartsWithSegments("/some-endpoint-that-needs-sync-io"))
    {
        var syncIoFeature = context.Features.Get<IHttpBodyControlFeature>();
        if (syncIoFeature != null)
        {
            syncIoFeature.AllowSynchronousIO = true;
        }
    }

    await next();
})
景哲
2023-03-14

您可能有以下问题:https://github.com/aspnet/AspNetCore/issues/8302

你可以在这里找到更多信息:https://github.com/aspnet/AspNetCore/issues/7644

在问题得到解决之前,一个解决方法是允许同步IO。将其置于启动状态。Kestrel或IIS的cs:

public void ConfigureServices(IServiceCollection services)
{
    // If using Kestrel:
    services.Configure<KestrelServerOptions>(options =>
    {
        options.AllowSynchronousIO = true;
    });

    // If using IIS:
    services.Configure<IISServerOptions>(options =>
    {
        options.AllowSynchronousIO = true;
    });
}
 类似资料:
  • 我刚起步 (更新:解决方案是将UseRouting移动到/api/error路由下) 但是当时,永远不会调用错误控制器方法。

  • 我想为新用户设置一封确认电子邮件。 所以当调试时,单击链接时,userId是可以的,但“code”输入参数为空,所以 是真的,然后执行 发送给注册用户的电子邮件如下所示: 请单击此链接确认您的帐户:https://localhost:44314/Account/ConfirmEmail?userId=3ec7ac6a-3329-4821-a09b-aa4843598eaa 编辑:链接包含 实际上,

  • 问题内容: 我正在尝试在用户空间中使用mmap读取“ mem_map”开始的物理内存。它是一个包含所有物理页面的数组。这是一台运行3.0内核的i386计算机。 代码是这样的: 我以此为根。输出为: 可以肯定的是,我搜索了问题并将以下行添加到我的/etc/sysctl.conf文件中: 但这也不起作用。 谁知道为什么不允许这样的mem_map操作,以及如何解决呢? 谢谢。 问题答案: 听起来好像内核

  • 我的问题和这个差不多。 ASP。Net Core与EF Core和CosmosDB-身份问题 提供的答案不起作用。这会产生其他问题。当我从升级我的应用程序时,这些错误开始出现。NET Core 3.1 to。净5。降级应用程序使所有错误都消失了。显然,这个问题与efcore 5中引入的对cosmos的乐观并发支持有关。 https://docs.microsoft.com/en-us/ef/cor

  • 当我试图打开索引时。php在浏览器中我看到错误: 在error.log: 2013/11/04 22:40:07[错误]3435#0:*4发送到stderr的FastCGI:“无法打开主脚本:/var/www/index.php(不允许操作)”,同时从上游读取响应头,客户端:10.0。2.2,服务器:localhost,请求:“GET/HTTP/1.1”,上游:fastcgi://127.0.0.

  • 我正在尝试从页面: 控制器: 但是我似乎无法在前端检索会话