我想提供一种替代性答案,并附带一些历史,以便您了解为什么Kestrel会出现,即使您只使用Windows和IIS。
在2000年之前ASP.NET开发的最初阶段,微软显然创建了两个部分来托管ASP.NET WebForms应用程序:
- Cassini,后来成为Visual Studio中的ASP.NET Development Server。它是一个完全由C#编写的托管Web服务器,基于
HttpListener
。当然,由于它只用于开发,许多功能从未实现。由于Microsoft将Cassini的源代码向公众开放,因此有第三方分支了代码库并添加了更多功能,这就开始形成了Cassini家族。
- ASP.NET在IIS上的支持(修订版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
取代。这可以看作是ASP.NET在IIS上的第二个版本。因此,ASP.NET应用程序被托管在IIS工作进程w3wp.exe
中。
IIS 7及以上版本引入了集成管道需要进一步更改,将aspnet_isapi.dll
替换为webengine4.dll
。这可以看作是ASP.NET在IIS上的第三个版本。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?这主要是当今互联网实践的结果。大多数网站使用反向代理从您的Web浏览器获取请求,然后将其转发到后台的应用程序服务器。
- IIS Express/IIS/nginx/Apache是反向代理服务器
- Kestrel/NodeJS/Tomcat等是应用程序服务器
另一个答案已经显示了到Microsoft文档的链接,所以您可以查看。微软最初开发了HttpPlatformHandler来使IIS成为Java/Python等的足够好的反向代理,并计划在ASP.NET Core中使用它。在开发过程中出现了问题,所以后来微软专门为ASP.NET Core开发了ASP.NET Core模块。这是IIS上的ASP.NET支持修订版4。自 ASP.NET Core 2.2 开始,ASP.NET Core 模块适用于 IIS (版本 2),可以将 .NET Core 环境托管在 IIS 工作进程 (
w3wp.exe
) 内,类似于 ASP.NET 2.x/4.x。这种模式被称为“
IIS 内部托管模型”,可以视为 IIS 修订版 5 上的 ASP.NET 支持。
最近一项更新(2023 年 1月)是 ASP.NET Core/Kestrel 可以用来托管反向代理功能本身,正如
开源 YARP 项目揭示的那样。
Kestrel/YARP 现已广泛用于 Microsoft Azure 中,在许多场景中取代了 IIS ARR,因此现在您可以使用 Kestrel/YARP 托管自己的生产 Web 应用程序,而无需其他 Web 服务器(IIS/nginx/Apache)在前面。