【问题标题】:.NET Core 3 preview: Synchronous operations are disallowed.NET Core 3 预览版:不允许同步操作
【发布时间】: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);

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

【问题讨论】:

标签: angularjs .net-core synchronous .net-core-3.0


【解决方案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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-27
        • 2017-06-21
        • 1970-01-01
        相关资源
        最近更新 更多