.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