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

Nor*_*son 8 .net core synchronous preview

我有一个要移植到.Net Core的AngularJs应用程序。

在以前的.Net Core 3预览版中,它运行正常。3.2。

但是,升级到最新版本3.3后,某些get请求将返回此错误:

InvalidOperationException:不允许进行同步操作。调用WriteAsync或将AllowSynchronousIO设置为true。

我看不到为什么只有某些请求而不是其他请求会发生这种情况。

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

谁能对此有所启发?

Nor*_*son 10

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

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

// Startup.ConfigureServices

services.Configure<IISServerOptions>(options =>
{
  options.AllowSynchronousIO = true;
});
Run Code Online (Sandbox Code Playgroud)

感谢克里斯·罗斯的帮助

  • 这对我来说也不起作用,我最终不得不将被调用的代码转换为异步(正如错误消息所示,我使用了 Read/WriteAsync) (3认同)

pkm*_*iec 9

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

   public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureKestrel((context, options) =>
                {
                    options.AllowSynchronousIO = true;
                })
Run Code Online (Sandbox Code Playgroud)


Abo*_*our 6

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

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

或在所有应用范围内禁用

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureKestrel((context, options) =>
            {
                options.AllowSynchronousIO = true;
            })
Run Code Online (Sandbox Code Playgroud)

或在服务中配置启动

services.Configure<IISServerOptions>(options =>
{
  options.AllowSynchronousIO = true;
});
Run Code Online (Sandbox Code Playgroud)