什么是 Kestrel(与 IIS / Express)

2024-04-17

什么是 kestrel Web 服务器以及它与 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 中托管,所以我什至感到困惑needKestrel,但似乎没有其他选择 - 即使是最简单的示例也使用 Kestrel。


我想提供一个替代答案,其中包含一些历史记录,以便您可以理解为什么 Kestrel 出现,即使您只使用 Windows 和 IIS。

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

  • Cassini 后来成为 Visual Studio 中的 ASP.NET 开发服务器。它是一个基于 C# 编写的完全托管的 Web 服务器HttpListener。当然,由于它仅用于开发,因此许多功能从未实现。随着微软向公众开放卡西尼的源代码,第三方分叉了代码库并添加了更多功能,从而启动了卡西尼家族。
  • 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 with webengine4.dll。这可以看作是 IIS 修订版 3 上的 ASP.NET 支持。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?这主要是当今互联网实践的结果。大多数网站使用反向代理从网络浏览器接收请求,然后转发到后台的应用程序服务器。

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

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

微软开发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 工作进程内托管 .NET Core 环境(w3wp.exe),与 ASP.NET 2.x/4.x 非常相似。这种模式称为“IIS 进程内托管” https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.2#in-process-hosting-model。它可以被视为 IIS 修订版 5 上的 ASP.NET 支持。

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

最近的一项更新(2023 年 1 月)是 ASP.NET Core/Kestrel 可用于托管反向代理功能本身,如下所示开源 YARP 项目揭晓 https://microsoft.github.io/reverse-proxy/.

据报道,Kestrel/YARP 现在在 Microsoft Azure 内部广泛使用,在许多场景中取代 IIS ARR,因此现在您实际上可以使用 Kestrel/YARP 托管自己的生产 Web 应用程序,而无需在前面使用任何其他 Web 服务器(IIS/nginx/Apache):出色地。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 Kestrel(与 IIS / Express) 的相关文章

随机推荐

  • 基础目标、活动目标、部署目标

    我知道这个问题的部分内容有多种不同的形式 但我想确保我的答案是正确的 以下是我的假设和理解 我想在提交之前知道它们是否正确 我的应用程序假定所有操作系统都支持功能 因此我应该 将Active SDK设置为最新 当前为SDK 3 0 将部署目
  • Shapeless 中具有常量返回类型的多态函数

    长话短说 我试图弄清楚如何定义从通用输入到单一类型输出的函数 的背景 这是一个延续映射无形状记录 https stackoverflow com questions 26375886 mapping over shapeless recor
  • VSTO 加载项中的 SetProcessDPIAware

    网上有很多关于通过调用为 Winforms 应用程序设置 DPI 感知的帖子SetProcessDPIAware 或者通过对应用程序的清单进行一些相关更改 例如 如何配置应用程序以在具有高 DPI 设置 例如 150 的计算机上正确运行 h
  • 移动应用程序在后台时的 GPS 位置(使用 ionicframework)

    我需要实现一个应用程序来存储用户从 A 移动到 B 时的旅程 路径 现在 我知道 ionicframework 可以使用 GPS 但是当我的应用程序转到后台时会发生什么 我的应用程序如何继续存储用户位置 这可能吗 有没有我可以使用的插件 请
  • 图表网格线样式

    我正在使用 Visual Studio 2010 中的标准图表库 该图表工作正常 但我无法更改轴网格线样式 这些是已在 Form1 Designers cs 中设置的属性 chartArea3 Name ChartArea1 this ch
  • 当我们尝试将字符打印为浮点数和十六进制时,为什么 printf 的行为不同?

    我尝试在 printf 中将字符打印为浮点数并得到输出 0 这是为什么 还 char c z printf f X c c 给出了一些奇怪的十六进制输出 而当我这样做时输出是正确的 printf X c 为什么会这样呢 The printf
  • 如何在 Microsoft Surface 应用程序中显示 PDF 文档?

    我想在我的 Microsoft Surface 应用程序中显示 PDF 文档 我做了一些搜索 发现了很多可能性 但如果在 Microsoft Surface 中使用 所有这些似乎都有一些缺点 这个有趣的 http www screencas
  • 有类似“Firebug for IE”(用于调试 JavaScript)之类的东西吗?

    我正在尝试修复一些 JavaScript 错误 在 Firefox 中工作时 Firebug 使调试这些问题变得更加容易 但是当代码在 Firefox 上运行正常但 IE 却抱怨时 你该怎么办 您还可以查看IE 开发者工具栏 http ww
  • 使用 GOOGLE MAP API 的简单 Android 程序

    尝试使用 Google 地图 这是我使用 google Map API 的第一个程序 由于日志错误 我无法执行 我需要纠正自己的地方 MainActivity java public class MainActivity extends A
  • 如何将 {1,0} 与正则表达式匹配

    or 0 1 will match必要时采取一些模式 但现在我想反过来做 Say 不匹配如果需要的话 解决办法是什么 后面加个问号就可以了 0 1 as in 0 1 并且它会更喜欢匹配零次而不是一次 问号使它 不贪婪 这意味着它不会尽可能
  • UIButton 在 iOS 5.x 中不起作用,在 iOS 6.x 中一切正常

    通过点击主 UIView 上的简单 UIButton 附加视图 子视图 会出现在屏幕中央 以编程方式创建的子视图 在该子视图上 我有 UIButton 启动 MPMoviePlayer 此代码位于创建子视图的方法内部 Create play
  • Hibernate注解@Where带参数

    我目前有此类产品 以这种方式注释 我正在使用软删除 SQLDelete sql UPDATE products SET active 0 WHERE id product and last modification date Where c
  • IE(11)CSS多列处理不当?

    我正在使用 CSS 多列构建 2 列布局 并且我想给出有关在何处断开列的提示 所以我说 columns 2在容器上 以及break before column在我想要休息的地方 IE 在我的例子中是 11 决定将我的内容分成 3 列并溢出到
  • 使用条件对向量进行子集化(不包括 NA)

    vector1 c 1 2 3 NA condition1 vector1 2 vector1 condition1 vector1 condition1 TRUE 在上面的代码中 条件1是 FALSE TRUE FALSE NA 第三行和
  • 在执行器服务中实现线程超时

    所以现在我有一个相当基本的执行器服务 我用它来将程序分解为线程 如下所示 ExecutorService threadPool Executors newFixedThreadPool 12 for int i 0 i lt objectA
  • 如何在模块化 Android 应用程序中共享依赖项

    我有一个以模块化方式架构的 Android 项目 我通过将项目的源代码划分到多个 Gradle 模块之间来模块化项目 遵循干净的架构 https antonioleiva com clean architecture android 这是应
  • GDB可以杀死一个特定的线程吗?

    我正在运行一个应用程序 firefox 我想知道是否可以使用 GDB 附加到进程并杀死特定线程 有没有办法做到这一点 我知道此操作可能会使应用程序崩溃 EDIT 在此调试会话中 ps ax显示firefox pid是1328 gdb App
  • 如何格式化以仅包含小数(如果有)

    如果我只想显示非整数的小数 那么格式化小数的最佳方法是什么 Eg decimal amount 1000M decimal vat 12 50M 格式化后我想要 Amount 1000 not 1000 0000 Vat 12 5 not
  • 如何将 Valve 添加到 Apache Tomcat

    我通过扩展 org apache catalina valves ValveBase 类并实现 inovoke 方法为 Apache Tomcat 编写了一个 Valve 现在我想将它添加到我的Tomcat中执行 请告诉我步骤 使用您的 V
  • 什么是 Kestrel(与 IIS / Express)

    什么是 kestrel Web 服务器以及它与 IIS IIS Express 有何关系 我以前在 IIS Express 上开发应用程序并将它们托管在 IIS Web 服务器上 对于 ASP NET Core 我依赖于Microsoft