.NET Core 3 预览版:不允许同步操作

Posted

技术标签:

【中文标题】.NET Core 3 预览版:不允许同步操作【英文标题】:.NET Core 3 preview: Synchronous operations are disallowed 【发布时间】:2019-07-29 20:13:55 【问题描述】:

我有一个要移植到 .NET Core 的 Angular.js 应用程序。

在之前版本的 .NET Core 3 预览版中运行良好; 3.2.

但是,升级到最新的 3.3 后,一些 get 请求返回此错误:

InvalidOperationException:不允许同步操作。称呼 WriteAsync 或将 AllowSynchronousIO 设置为 true。

我不明白为什么只有一些请求会发生这种情况,而其他请求则不会。

我相信默认情况下 Angular.js 会异步:xhr.open(method, url, true);

任何人都可以对此有所了解吗?

【问题讨论】:

您是否尝试将设置 AllowSynchronousIO 设置为 true? 这个错误在.NET Core 3.0 AllowSynchronousIO Workaround Khalid Abuhakmeh 的帖子中有详细描述 【参考方案1】:

这里描述了这个问题:https://github.com/aspnet/AspNetCore/issues/8302

目前的解决方法是在 startup.cs 中手动将 AllowSynchronous 设置为 true;

// 启动.ConfigureServices

services.Configure<IISServerOptions>(options =>

  options.AllowSynchronousIO = true;
);

【讨论】:

这对我也不起作用,我最终不得不将被调用的代码转换为异步(如错误消息所述,我使用了 Read/WriteAsync)【参考方案2】:

值得注意的是,如果您直接托管在 kestrel 上,那么您的 Program.cs 应该有适当的 ConfigureKestrel 调用

   public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureKestrel((context, options) =>
                
                    options.AllowSynchronousIO = true;
                )

【讨论】:

【参考方案3】:

您可以通过特殊方法禁用它

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

【讨论】:

【参考方案4】:

如果你像我一样使用 CustomWebApplicationFactory,你可以在它的构造函数中设置标志,它使我的测试直接从 VS2019 工作。

public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup: class

    public CustomWebApplicationFactory()
    
        Server.AllowSynchronousIO = true;
    

【讨论】:

以上是关于.NET Core 3 预览版:不允许同步操作的主要内容,如果未能解决你的问题,请参考以下文章

计算机操作系统实验指导 (第3版) 第四篇 操作系统学习指导和习题解析 第18章:进程同步与通信 习题和答案

.NET Core 3.0及ASP.NET Core 3.0 前瞻

Visual Studio 2019 16.1 使用 .NET Core 3.0

.net core redis的全套操作

IAsyncEnumerable<> 在 VS 2019 预览版 2(Core 3.0 预览版 1)中损坏

.net core 和 Mvc api 行为之间的区别