ASP.NET Core 和 Kestrel 设计决策:他们为什么使用 libuv?

ASP.NET Core and Kestrel design decision: Why do they use libuv?

我刚刚意识到 ASP.NET 核心应用程序不是纯粹的 CLR 应用程序 - 它们总是依赖于额外的二进制库:通过 Kestrel 的 libuv 或者,可能较少使用,http.sys.

我觉得这很令人惊讶,因为我原以为在 .NET Core(以及 .NET Standard)下已经有足够的网络 api 来制作一个性能不错的 Web 服务器,它具有纯粹在 .NET 中的异步 IO - 但他们并没有走那条路。

所以:

编辑:

我查看了 Kestrel 源代码,除了一个名为 Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv 的程序集之外,还有一个名为 Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets 的程序集。不过,套接字程序集的相应 NuGet 包仅处于预览状态。 (套接字组件当然不依赖于 libuv。)

计划切换到套接字,但它可能无法及时用于 Net Core 2.1,但可以用于 public。

似乎由于性能问题,截至 2017 年 12 月,他们不得不从 Sockets 切换回 Libuv:

https://github.com/aspnet/KestrelHttpServer/issues/2220