我想提供一个带有一些历史的替代答案,以便您可以理解为什么 Kestrel 会出现,即使您只使用 Windows 和 IIS。
在 2000 年之前的 ASP.NET 开发之初,显然微软创建了两个部分来托管 ASP.NET WebForms 应用程序,
- Cassini,后来成为 Visual Studio 中的 ASP.NET 开发服务器。它是一个完全托管的 Web 服务器,用 C# 编写,基于
HttpListener
. 当然,由于它只是用于开发,因此许多功能从未实现。随着微软将 Cassini 的源代码向公众开放,有第三方对代码库进行了分叉并添加了更多功能,从而开始了 Cassini 家族。
- 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
为webengine4.dll
. 这可以看作是对 IIS 版本 3 的 ASP.NET 支持。ASP.NET 和 IIS 管道是统一的。
您可以看到 ASP.NET 变得更加复杂,并且与 IIS 紧密集成,因此 Cassini 开始显示其时代,并逐渐被 IIS Express(一种用户模式 lite 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 等是应用服务器
另一个答案已经显示了指向 Microsoft 文档的链接,因此您可以查看一下。
Microsoft 最初开发 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 工作进程(w3wp.exe
)内托管 .NET Core 环境,与 ASP.NET 2.x/4.x 非常相似。这种模式称为“IIS 进程内托管”。它可以被认为是对 IIS 版本 5 的 ASP.NET 支持。
嗯,很长,但我希望我把所有必要的部分放在一起,你喜欢阅读它。