什么是 Kestrel(与 IIS / Express 相比)
What is Kestrel (vs IIS / Express)
什么是 kestrel 网络服务器,它与 IIS/IIS Express 有什么关系?
我曾在 IIS Express 上开发应用程序并将它们托管在 IIS Web 服务器上。使用 ASP.NET Core,我依赖于 Microsoft.AspNetCore.Server.Kestrel
,我的初创公司依赖于 .UseServer("Microsoft.AspNetCore.Server.Kestrel")
。但是当我 运行 我的网站时,我仍然在系统托盘中看到 IIS Express 图标。有人问我是用 IIS Express 还是 Kestrel,我不知道该说什么!
我没有任何跨平台要求,因为我在 PC 上开发并在 Azure 中托管,所以即使 need
Kestrel 我也很困惑,但似乎没有替代方案 - 即使是最简单的示例也使用 Kestrel。
What is Kestrel
这是一个成熟的网络服务器。您可以 运行 您的 ASP.NET 核心应用程序仅使用 Kestrel。
But when I run my website, I still get the IIS Express icon in the system tray
在您的 ASP.NET 应用程序中,可能在 wwwroot
目录中,您会看到 web.config 包含以下内容:
<?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。本质上,它所做的是将 all 请求转发给 Kestrel。 IIS Express(以及与此相关的 IIS)将不再 运行 ASP.NET 自身。相反,它们将充当代理,简单地从 Kestrel 来回传递请求和响应。使用IIS还是有好处的,具体来说就是安全配置,内核级缓存等等
来自 ms 文档:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x
Kestrel is a cross-platform web server for ASP.NET Core based on
libuv, a cross-platform asynchronous I/O library. Kestrel is the web
server that is included by default in ASP.NET Core project templates.
You can use Kestrel by itself or with a reverse proxy server, such as
IIS, Nginx, or Apache. A reverse proxy server receives HTTP requests
from the Internet and forwards them to Kestrel after some preliminary
handling.
更新:.net core 2.1,Kestrel 使用托管套接字而不是 libuv
来自 asp.net 核心 2.1 文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration
With the release of ASP.NET Core 2.1, Kestrel's default transport is
no longer based on Libuv but instead based on managed sockets.
我想提供一个备选答案,其中包含一些历史,这样即使您只使用 Windows 和 IIS,您也可以理解为什么会出现 Kestrel。
在 2000 年之前 ASP.NET 开发之初,Microsoft 显然创建了两个部分来托管 ASP.NET WebForms 应用程序,
- Cassini,后来在 Visual Studio 中成为 ASP.NET 开发服务器。它是一个基于
HttpListener
用 C# 编写的完全托管的 Web 服务器。当然,由于它仅用于开发,因此许多功能从未实现。由于 Microsoft 为 public 提供了 Cassini 的源代码,因此有第三方分叉了代码库并添加了更多功能,从而开始了 Cassini 家族。
- ASP.NET 支持 IIS(修订版 1)。因为那时候IIS是4.0和5.0/5.1,没有应用程序池之类的东西,所以ASP.NET连worker进程都有(
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.NET5(后来更名为 ASP.NETCore)发布并成为跨平台技术。显然,Microsoft 需要一种新的设计来支持 Windows、macOS 和 Linux,其中除了 IIS 之外,还应考虑所有主要的 Web 服务器,nginx/Apache(或其他 Web 服务器)。
我想很多人会同意微软从 NodeJS 中学到了很多东西,然后设计和开发了 Kestrel(最初基于 libuv
但可能很快会转向其他技术)。它最初是一个像 Cassini 这样的轻量级 Web 服务器,但后来添加了更多功能(就像评论的另一个答案一样,更多功能因此可以被视为完整的 Web 服务器)。虽然完全托管(存在一些本机依赖项),但它不再是像 Cassini 这样的玩具网络服务器。
那你为什么不能只使用 Kestrel?为什么仍然需要 IIS Express 和潜在的 IIS、nginx 或 Apache?这主要是当今互联网实践的结果。大多数网站使用反向代理从您的网络浏览器获取请求,然后转发到后台的应用程序服务器。
- IIS Express/IIS/nginx/Apache 是反向代理服务器
- Kestrel/NodeJS/Tomcat等为应用服务器
另一个答案已经显示link微软文档,你可以看一下。
Microsoft 开发 HttpPlatformHandler 最初是为了使 IIS 成为 Java/Python 等的足够好的反向代理,因此计划将其用于 ASP.NET Core。在开发过程中开始出现问题,所以后来微软专门为 ASP.NET Core 制作了 ASP.NET Core Module。这是对 IIS 修订版 4 的 ASP.NET 支持。
从 ASP.NET Core 2.2 开始,ASP.NET IIS 核心模块(版本 2)可以在 IIS 工作进程(w3wp.exe
)中托管 .NET Core 环境,与 ASP.NET 2.x/4.x.这种模式称为"IIS in-process hosting"。它可以被视为 ASP.NET IIS 修订版 5 的支持。
嗯,很长,但我希望我把所有必要的部分放在一起,你会喜欢阅读它。
- Kestrel 不支持同一端口上的多个应用程序。
- Windows Kestrel 上不存在身份验证。
- 请求过滤在 IIS 中的功能更加全面。
- IIS 中的 Mime 类型映射要好得多。
- HTTP 访问日志未在 Kestrel 中收集。
什么是 kestrel 网络服务器,它与 IIS/IIS Express 有什么关系?
我曾在 IIS Express 上开发应用程序并将它们托管在 IIS Web 服务器上。使用 ASP.NET Core,我依赖于 Microsoft.AspNetCore.Server.Kestrel
,我的初创公司依赖于 .UseServer("Microsoft.AspNetCore.Server.Kestrel")
。但是当我 运行 我的网站时,我仍然在系统托盘中看到 IIS Express 图标。有人问我是用 IIS Express 还是 Kestrel,我不知道该说什么!
我没有任何跨平台要求,因为我在 PC 上开发并在 Azure 中托管,所以即使 need
Kestrel 我也很困惑,但似乎没有替代方案 - 即使是最简单的示例也使用 Kestrel。
What is Kestrel
这是一个成熟的网络服务器。您可以 运行 您的 ASP.NET 核心应用程序仅使用 Kestrel。
But when I run my website, I still get the IIS Express icon in the system tray
在您的 ASP.NET 应用程序中,可能在 wwwroot
目录中,您会看到 web.config 包含以下内容:
<?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。本质上,它所做的是将 all 请求转发给 Kestrel。 IIS Express(以及与此相关的 IIS)将不再 运行 ASP.NET 自身。相反,它们将充当代理,简单地从 Kestrel 来回传递请求和响应。使用IIS还是有好处的,具体来说就是安全配置,内核级缓存等等
来自 ms 文档: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x
Kestrel is a cross-platform web server for ASP.NET Core based on libuv, a cross-platform asynchronous I/O library. Kestrel is the web server that is included by default in ASP.NET Core project templates.
You can use Kestrel by itself or with a reverse proxy server, such as IIS, Nginx, or Apache. A reverse proxy server receives HTTP requests from the Internet and forwards them to Kestrel after some preliminary handling.
更新:.net core 2.1,Kestrel 使用托管套接字而不是 libuv
来自 asp.net 核心 2.1 文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration
With the release of ASP.NET Core 2.1, Kestrel's default transport is no longer based on Libuv but instead based on managed sockets.
我想提供一个备选答案,其中包含一些历史,这样即使您只使用 Windows 和 IIS,您也可以理解为什么会出现 Kestrel。
在 2000 年之前 ASP.NET 开发之初,Microsoft 显然创建了两个部分来托管 ASP.NET WebForms 应用程序,
- Cassini,后来在 Visual Studio 中成为 ASP.NET 开发服务器。它是一个基于
HttpListener
用 C# 编写的完全托管的 Web 服务器。当然,由于它仅用于开发,因此许多功能从未实现。由于 Microsoft 为 public 提供了 Cassini 的源代码,因此有第三方分叉了代码库并添加了更多功能,从而开始了 Cassini 家族。 - ASP.NET 支持 IIS(修订版 1)。因为那时候IIS是4.0和5.0/5.1,没有应用程序池之类的东西,所以ASP.NET连worker进程都有(
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.NET5(后来更名为 ASP.NETCore)发布并成为跨平台技术。显然,Microsoft 需要一种新的设计来支持 Windows、macOS 和 Linux,其中除了 IIS 之外,还应考虑所有主要的 Web 服务器,nginx/Apache(或其他 Web 服务器)。
我想很多人会同意微软从 NodeJS 中学到了很多东西,然后设计和开发了 Kestrel(最初基于 libuv
但可能很快会转向其他技术)。它最初是一个像 Cassini 这样的轻量级 Web 服务器,但后来添加了更多功能(就像评论的另一个答案一样,更多功能因此可以被视为完整的 Web 服务器)。虽然完全托管(存在一些本机依赖项),但它不再是像 Cassini 这样的玩具网络服务器。
那你为什么不能只使用 Kestrel?为什么仍然需要 IIS Express 和潜在的 IIS、nginx 或 Apache?这主要是当今互联网实践的结果。大多数网站使用反向代理从您的网络浏览器获取请求,然后转发到后台的应用程序服务器。
- IIS Express/IIS/nginx/Apache 是反向代理服务器
- Kestrel/NodeJS/Tomcat等为应用服务器
另一个答案已经显示link微软文档,你可以看一下。
Microsoft 开发 HttpPlatformHandler 最初是为了使 IIS 成为 Java/Python 等的足够好的反向代理,因此计划将其用于 ASP.NET Core。在开发过程中开始出现问题,所以后来微软专门为 ASP.NET Core 制作了 ASP.NET Core Module。这是对 IIS 修订版 4 的 ASP.NET 支持。
从 ASP.NET Core 2.2 开始,ASP.NET IIS 核心模块(版本 2)可以在 IIS 工作进程(w3wp.exe
)中托管 .NET Core 环境,与 ASP.NET 2.x/4.x.这种模式称为"IIS in-process hosting"。它可以被视为 ASP.NET IIS 修订版 5 的支持。
嗯,很长,但我希望我把所有必要的部分放在一起,你会喜欢阅读它。
- Kestrel 不支持同一端口上的多个应用程序。
- Windows Kestrel 上不存在身份验证。
- 请求过滤在 IIS 中的功能更加全面。
- IIS 中的 Mime 类型映射要好得多。
- HTTP 访问日志未在 Kestrel 中收集。