我想提供一个替代答案,其中包含一些历史记录,以便您可以理解为什么 Kestrel 出现,即使您只使用 Windows 和 IIS。
在 2000 年之前的 ASP.NET 开发之初,微软显然创建了两个部分来托管 ASP.NET WebForms 应用程序,
- Cassini 后来成为 Visual Studio 中的 ASP.NET 开发服务器。它是一个基于 C# 编写的完全托管的 Web 服务器
HttpListener
。当然,由于它仅用于开发,因此许多功能从未实现。随着微软向公众开放卡西尼的源代码,第三方分叉了代码库并添加了更多功能,从而启动了卡西尼家族。
- IIS 上的 ASP.NET 支持(修订版 1)。因为当时的IIS是4.0和5.0/5.1,还没有应用程序池之类的东西,ASP.NET甚至有自己的工作进程(
aspnet_wp.exe
).
因此,要开发 Web 应用程序,您可以使用 Cassini,并使用 IIS 进行部署。
-
IIS 6 中应用程序池的引入需要 ASP.NET 端进行一些更改,因此aspnet_wp.exe
已过时并被替换aspnet_isapi.dll
。这可以看作是 IIS 修订版 2 上的 ASP.NET 支持。因此 ASP.NET 应用程序托管在 IIS 工作进程中w3wp.exe
.
-
IIS 7及更高版本中引入集成管道需要进一步更改,它取代了aspnet_isapi.dll
with webengine4.dll
。这可以看作是 IIS 修订版 3 上的 ASP.NET 支持。ASP.NET 和 IIS 管道是统一的。
可以看到 ASP.NET 已经变得更加复杂,并且与 IIS 紧密集成,因此 Cassini 开始显露出老态,并逐渐被 IIS Express(一种用户模式精简版 IIS)所取代。
因此,在很多情况下,当人们责怪 IIS 速度慢时,他们实际上应该责怪 ASP.NET。没有 ASP.NET 的 IIS 本身相当快速和稳定,而 ASP.NET 的开发并没有考虑到足够的性能指标(因为 WebForms 非常注重生产力和 RAD)。
随后在 2014 年 11 月,ASP.NET 5(后更名为 ASP.NET Core)发布,成为跨平台技术。显然,微软需要一个新的设计来支持 Windows、macOS 和 Linux,其中除了 IIS 之外,还应该考虑所有主要的 Web 服务器、nginx/Apache(或其他 Web 服务器)。
我想很多人都会同意微软从 NodeJS 中学到了很多东西,然后设计并开发了 Kestrel(基于libuv
最初但可能很快就会转向其他技术)。它最初是一个像 Cassini 一样的轻量级 Web 服务器,但后来添加了更多功能(就像评论的另一个答案一样,有更多功能,因此可以被视为完整的 Web 服务器)。尽管完全托管(存在一些本机依赖项),但它不再是像 Cassini 那样的玩具 Web 服务器。
那为什么不能直接使用 Kestrel 呢?为什么仍然需要 IIS Express 以及可能的 IIS、nginx 或 Apache?这主要是当今互联网实践的结果。大多数网站使用反向代理从网络浏览器接收请求,然后转发到后台的应用程序服务器。
- IIS Express/IIS/nginx/Apache 是反向代理服务器
- Kestrel/NodeJS/Tomcat等是应用服务器
另一个答案已经显示了微软文档的链接,所以你可以看一下。
微软开发HttpPlatformHandler最初是为了让IIS成为Java/Python等足够好的反向代理,因此计划将其用于ASP.NET Core。在开发过程中就开始出现问题,所以后来微软专门为ASP.NET Core制作了ASP.NET Core Module。这就是 IIS 修订版 4 上的 ASP.NET 支持。
从 ASP.NET Core 2.2 开始,IIS 的 ASP.NET Core 模块(版本 2)可以在 IIS 工作进程内托管 .NET Core 环境(w3wp.exe
),与 ASP.NET 2.x/4.x 非常相似。这种模式称为“IIS 进程内托管” https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.2#in-process-hosting-model。它可以被视为 IIS 修订版 5 上的 ASP.NET 支持。
嗯,相当长,但我希望我把所有必要的部分放在一起,你会喜欢阅读它。
最近的一项更新(2023 年 1 月)是 ASP.NET Core/Kestrel 可用于托管反向代理功能本身,如下所示开源 YARP 项目揭晓 https://microsoft.github.io/reverse-proxy/.
据报道,Kestrel/YARP 现在在 Microsoft Azure 内部广泛使用,在许多场景中取代 IIS ARR,因此现在您实际上可以使用 Kestrel/YARP 托管自己的生产 Web 应用程序,而无需在前面使用任何其他 Web 服务器(IIS/nginx/Apache):出色地。