什么是 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 的支持。

嗯,很长,但我希望我把所有必要的部分放在一起,你会喜欢阅读它。

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