什么是Kestrel(相对于IIS / Express)


158

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


如果对这项新技术有疑问,请从有问题的项目的GitHub页面开始,然后查看其Wiki。您将在此Servers Wiki页面上运行ASP.NET存储库。
梅森

11
当然,然后您会遇到诸如之类的东西This document is now out of date. For up-to-date ASP.NET Core documentation go to: http://docs.asp.net。哎呀

Answers:


115

什么是茶est

这是功能强大的Web服务器。您可以仅使用Kestrel运行ASP.NET Core应用程序。

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

在您的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。本质上,这是将所有请求转发给Kestrel。IIS Express(和IIS)本身将不再运行ASP.NET。相反,它们将充当代理,仅从Kestrel来回传递请求和响应。使用IIS仍然有很多优点,特别是它为您提供安全配置,内核级缓存等。


5
关于使用ASP.Net核心youtu.be/e2qZvabmSvo时
幕后情况的

4
由于引入了ASP.NET Core Module(而不是HttpPlatformHandler),因此该答案有些过时了。我还提供了更多故事和相关产品的替代答案。
Lex Li

171

我想提供一个有历史的替代答案,以便您即使只使用Windows和IIS,也可以理解为什么Kestrel会出现。

显然,在2000年之前的ASP.NET开发初期,Microsoft创建了两个托管ASP.NET WebForms应用程序的组件,

  • Cassini,后来成为Visual Studio中的ASP.NET开发服务器。它是基于C#编写的完全托管的Web服务器HttpListener。当然,由于仅用于开发,因此从未实现许多功能。随着Microsoft向公众提供Cassini的源代码,有些第三方分叉了代码库并添加了更多功能,从而创立了Cassini系列。
  • 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.dllwebengine4.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)发布并成为跨平台技术。显然,Microsoft需要一种新的设计来支持Windows,macOS和Linux,在这些设计中,除IIS外,还应考虑所有主要的Web服务器,nginx / Apache(或其他Web服务器)。

我认为许多人都同意微软从NodeJS中学到了很多,然后设计和开发了Kestrel(libuv最初基于Kestrel,但可能很快会转向其他技术)。它最初是像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版本4上的ASP.NET支持。

从ASP.NET Core 2.2开始,用于IIS的ASP.NET Core模块(版本2)可以在IIS工作进程(w3wp.exe)中托管.NET Core环境,与ASP.NET 2.x / 4.x非常相似。此模式称为“ IIS进程内托管”。可以将其视为IIS版本5上的ASP.NET支持。

好吧,很长,但是我希望我把所有必要的部分放在一起,并且您喜欢阅读它。


1
好答案。但是您不能简单地说,将茶k与IIS结合使用是“当今互联网实践的结果”。使用反向代理有很多理由。在这里提到一些本来很好。
Nilay Vishwakarma

13
“使用反向代理有很多理由”属于它自己的问答。通常人们可以通过询问Google来找到好的资源,因此我没有将其附加到已经足够长的答案中。
Lex Li

12

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

Kestrel是基于libuv(跨平台异步I / O库)的ASP.NET Core跨平台Web服务器。Kestrel是Web服务器,默认情况下包含在ASP.NET Core项目模板中。

您可以单独使用Kestrel,也可以将其与反向代理服务器(例如IIS,Nginx或Apache)一起使用。反向代理服务器从Internet接收HTTP请求,并在进行一些初步处理后将其转发给Kestrel。


更新:.net核心2.1,如果libuv,则Kestrel会使用托管套接字

来自asp.net Core 2.1的文档,网址为:https : //docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/kestrel? view = aspnetcore-2.1#transport- configuration

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.