什么是Kestrel(vs IIS / Express)

时间:2016-02-25 21:58:03

标签: asp.net iis asp.net-core kestrel-http-server

什么是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中托管,所以我很困惑,如果我甚至need Kestrel,但它似乎没有替代方案 - 即使最简单的样品也使用Kestrel。

4 个答案:

答案 0 :(得分:90)

  

什么是红隼?

这是一个完整的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仍然有优势,特别是它为您提供安全配置,内核级缓存等。

答案 1 :(得分:90)

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

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

  • Cassini,后来成为Visual Studio中的ASP.NET Development Server。它是基于HttpListener以C#编写的完全托管的Web服务器。当然,由于它仅用于开发,因此许多功能从未实现过。由于微软为公众提供了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.dll替换为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服务器)。虽然完全托管(存在一些本机依赖项),但它不再是像卡西尼那样的玩具网络服务器。

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

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

另一个答案已经显示了Microsoft文档的链接,因此您可以看看。

Microsoft最初开发了HttpPlatformHandler,使IIS成为Java / Python等的反向代理,因此计划将其用于ASP.NET Core。问题在开发过程中开始出现,因此后来Microsoft专门为ASP.NET Core制作了ASP.NET核心模块。这是IIS版本4的ASP.NET支持。

从ASP.NET Core 2.2开始,用于IIS的ASP.NET核心模块(版本2)可以在IIS工作进程(w3wp.exe)内托管.NET Core环境,非常类似于ASP.NET 2.x / 4.x版此模式称为"IIS in-process hosting"。它可以被视为IIS修订版5上的ASP.NET支持。

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

答案 2 :(得分:7)

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

  

Kestrel是基于ASP.NET Core的跨平台Web服务器   libuv,一个跨平台的异步I / O库。红隼是网络   ASP.NET Core项目模板中默认包含的服务器。

     

您可以单独使用Kestrel,也可以使用反向代理服务器   IIS,Nginx或Apache。反向代理服务器接收HTTP请求   来自互联网并在经过一些初步调查后将它们转发给Kestrel   处理

更新:.net core 2.1,如果libuv

,Kestrel使用托管套接字

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

  

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

答案 3 :(得分:2)

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