什么是kestrel web服务器,它与IIS / IIS Express有什么关系?

我在IIS Express上开发应用程序,并将它们托管在IIS web服务器上。ASP。我依赖于Microsoft.AspNetCore.Server.Kestrel,我的初创公司有. useserver ("Microsoft.AspNetCore.Server.Kestrel")。但是当我运行我的网站时,我仍然在系统托盘中看到IIS Express图标。有人问我用的是IIS Express还是Kestrel,我不知道该说什么!

当我在Azure上的PC和主机上开发时,我没有任何跨平台需求,所以我很困惑我是否需要Kestrel,但似乎没有替代方案-即使是最简单的示例也使用Kestrel。


当前回答

我想提供一个替代的答案,有一些历史,这样你就可以理解为什么Kestrel来了,即使你只使用Windows和IIS。

在ASP开始的时候。NET开发在2000年之前,显然微软创建了两个部分来托管ASP。NET WebForms应用程序,

Cassini, later became ASP.NET Development Server in Visual Studio. It is a fully managed web server written in C# based on HttpListener. Of course, since it was for development only, many features were never implemented. As Microsoft made the source code of Cassini available for the public, there are third parties who forked the code base and added more features, which started the Cassini family. ASP.NET support on IIS (revision 1). Because IIS was 4.0 and 5.0/5.1 at that time, which has nothing like application pools, ASP.NET even has its own worker process (aspnet_wp.exe).

所以要开发一个web应用,你使用卡西尼,部署你使用IIS。

The introduction of application pools in IIS 6 required some changes on ASP.NET side, so aspnet_wp.exe became obsolete and replaced by aspnet_isapi.dll. That can be seen as ASP.NET support on IIS revision 2. So ASP.NET apps are being hosted in IIS worker processes w3wp.exe. The introduction of integrated pipeline in IIS 7 and above required further changes, which replaced aspnet_isapi.dll with webengine4.dll. That can be seen as ASP.NET support on IIS revision 3. ASP.NET and IIS pipelines are unified.

你可以看到ASP。NET已经变得更加复杂,并且与IIS紧密集成,因此Cassini开始显示出它的年龄,并逐渐被IIS Express(用户模式的精简版IIS)所取代。

因此,在许多情况下,当人们指责IIS太慢时,他们应该指责ASP。NET。IIS本身没有ASP。NET非常快速和稳定,而ASP。NET在开发时没有考虑到足够的性能指标(因为WebForms非常关注生产力和快速开发)。

2014年11月,ASP。NET 5(后来更名为asp.net 5。NET Core)的发布,并成为一种跨平台技术。显然,微软需要一个新的设计来支持Windows、macOS和Linux,除了IIS之外,所有主要的web服务器、nginx/Apache(或其他web服务器)都应该考虑在内。

我想很多人会同意微软从NodeJS中学到了很多东西,然后设计和开发了Kestrel(最初基于libuv,但可能很快会转向其他技术)。它最初是一个像Cassini一样的轻量级web服务器,但后来添加了更多的功能(比如另一个回答,更多的功能,所以可以被视为一个完整的web服务器)。虽然完全托管(存在一些本地依赖),但它不再是像Cassini那样的玩具web服务器。

那你为什么不能直接用红隼?为什么仍然需要IIS Express和潜在的IIS, nginx或Apache ?这主要是当今互联网实践的结果。大多数网站使用反向代理从您的web浏览器接收请求,然后转发到后台的应用程序服务器。

IIS Express/IIS/nginx/Apache为反向代理服务器 Kestrel/NodeJS/Tomcat等是应用服务器

另一个答案已经显示了微软文档的链接,所以您可以查看一下。

微软最初开发HttpPlatformHandler是为了使IIS成为Java/Python等足够好的反向代理,所以计划将它用于ASP。净的核心。在开发过程中开始出现问题,所以后来微软开发了ASP。NET核心模块,专门为ASP。净的核心。这是ASP。在IIS修订版4上支持NET。

从ASP开始。asp.net Core 2.2;.NET Core Module for IIS (version 2)可以在IIS工作进程(w3wp.exe)中托管.NET Core环境,非常类似于ASP。NET 2. x / 4. x。这种模式称为“IIS进程内托管”。它可以被认为是ASP。在IIS版本5上支持NET。

好吧,很长,但我希望我把所有必要的东西放在一起,你会喜欢读它。

最近的一次更新(2023年1月)是ASP。NET Core/Kestrel可以用来承载反向代理功能本身,正如开源YARP项目所揭示的那样。

Kestrel/YARP现在在微软Azure中广泛使用,在许多场景中取代IIS ARR,所以现在你可以使用Kestrel/YARP托管自己的生产web应用程序,而不需要任何其他web服务器(IIS/nginx/Apache)。

其他回答

什么是红隼

它是一个成熟的网络服务器。你可以运行你的ASP。NET核心应用程序只使用Kestrel。

但是当我运行我的网站时,我仍然在系统托盘中看到IIS Express图标

在你的ASP。在wwwroot目录下,你会看到一个web。包含以下内容的配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
    <handlers>
    <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
    </handlers>
    <httpPlatform processPath="%DNX_PATH%" arguments="%DNX_ARGS%" stdoutLogEnabled="false" startupTimeLimit="3600"/>
</system.webServer>
</configuration>

这是HttpPlatformHandler。从本质上讲,这是将所有请求转发给Kestrel。IIS Express(与此相关的IIS)将不能运行ASP。NET本身。相反,它们将充当代理,简单地从Kestrel来回传递请求和响应。使用IIS仍然有优势,特别是它为您提供了安全配置、内核级缓存等。

来自ms docs: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x

Kestrel是一个跨平台的web服务器。NET Core基于 libuv,跨平台异步I/O库。红隼就是网 默认包含在ASP。NET Core项目模板。 您可以单独使用Kestrel,也可以与反向代理服务器一起使用,例如 IIS、Nginx或Apache。反向代理服务器接收HTTP请求 从互联网上下载,经过一些初步准备后,将它们转发给隼 处理。


更新:.net core 2.1, Kestrel使用托管套接字代替libuv

来自asp.net core 2.1文档:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration

随着ASP的发布。NET Core 2.1, Kestrel的默认传输是 不再基于Libuv,而是基于托管套接字。

我想提供一个替代的答案,有一些历史,这样你就可以理解为什么Kestrel来了,即使你只使用Windows和IIS。

在ASP开始的时候。NET开发在2000年之前,显然微软创建了两个部分来托管ASP。NET WebForms应用程序,

Cassini, later became ASP.NET Development Server in Visual Studio. It is a fully managed web server written in C# based on HttpListener. Of course, since it was for development only, many features were never implemented. As Microsoft made the source code of Cassini available for the public, there are third parties who forked the code base and added more features, which started the Cassini family. ASP.NET support on IIS (revision 1). Because IIS was 4.0 and 5.0/5.1 at that time, which has nothing like application pools, ASP.NET even has its own worker process (aspnet_wp.exe).

所以要开发一个web应用,你使用卡西尼,部署你使用IIS。

The introduction of application pools in IIS 6 required some changes on ASP.NET side, so aspnet_wp.exe became obsolete and replaced by aspnet_isapi.dll. That can be seen as ASP.NET support on IIS revision 2. So ASP.NET apps are being hosted in IIS worker processes w3wp.exe. The introduction of integrated pipeline in IIS 7 and above required further changes, which replaced aspnet_isapi.dll with webengine4.dll. That can be seen as ASP.NET support on IIS revision 3. ASP.NET and IIS pipelines are unified.

你可以看到ASP。NET已经变得更加复杂,并且与IIS紧密集成,因此Cassini开始显示出它的年龄,并逐渐被IIS Express(用户模式的精简版IIS)所取代。

因此,在许多情况下,当人们指责IIS太慢时,他们应该指责ASP。NET。IIS本身没有ASP。NET非常快速和稳定,而ASP。NET在开发时没有考虑到足够的性能指标(因为WebForms非常关注生产力和快速开发)。

2014年11月,ASP。NET 5(后来更名为asp.net 5。NET Core)的发布,并成为一种跨平台技术。显然,微软需要一个新的设计来支持Windows、macOS和Linux,除了IIS之外,所有主要的web服务器、nginx/Apache(或其他web服务器)都应该考虑在内。

我想很多人会同意微软从NodeJS中学到了很多东西,然后设计和开发了Kestrel(最初基于libuv,但可能很快会转向其他技术)。它最初是一个像Cassini一样的轻量级web服务器,但后来添加了更多的功能(比如另一个回答,更多的功能,所以可以被视为一个完整的web服务器)。虽然完全托管(存在一些本地依赖),但它不再是像Cassini那样的玩具web服务器。

那你为什么不能直接用红隼?为什么仍然需要IIS Express和潜在的IIS, nginx或Apache ?这主要是当今互联网实践的结果。大多数网站使用反向代理从您的web浏览器接收请求,然后转发到后台的应用程序服务器。

IIS Express/IIS/nginx/Apache为反向代理服务器 Kestrel/NodeJS/Tomcat等是应用服务器

另一个答案已经显示了微软文档的链接,所以您可以查看一下。

微软最初开发HttpPlatformHandler是为了使IIS成为Java/Python等足够好的反向代理,所以计划将它用于ASP。净的核心。在开发过程中开始出现问题,所以后来微软开发了ASP。NET核心模块,专门为ASP。净的核心。这是ASP。在IIS修订版4上支持NET。

从ASP开始。asp.net Core 2.2;.NET Core Module for IIS (version 2)可以在IIS工作进程(w3wp.exe)中托管.NET Core环境,非常类似于ASP。NET 2. x / 4. x。这种模式称为“IIS进程内托管”。它可以被认为是ASP。在IIS版本5上支持NET。

好吧,很长,但我希望我把所有必要的东西放在一起,你会喜欢读它。

最近的一次更新(2023年1月)是ASP。NET Core/Kestrel可以用来承载反向代理功能本身,正如开源YARP项目所揭示的那样。

Kestrel/YARP现在在微软Azure中广泛使用,在许多场景中取代IIS ARR,所以现在你可以使用Kestrel/YARP托管自己的生产web应用程序,而不需要任何其他web服务器(IIS/nginx/Apache)。

Kestrel不支持同一端口上的多个应用程序。 在Kestrel上不存在Windows身份验证。 请求过滤在IIS中有更全面的功能。 Mime类型映射在IIS中要好得多。 在Kestrel中不收集HTTP访问日志。