什么是Kestrel(vs IIS/Express)

Sea*_*ean 134 asp.net iis kestrel-http-server asp.net-core

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

Lex*_* Li 135

我想提供一个替代答案,有一些历史记录,这样你就可以理解为什么Kestrel来了,即使你只使用Windows和IIS.

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

  • Cassini,后来成为Visual Studio中的ASP.NET开发服务器.它是一个用C#编写的完全托管的Web服务器HttpListener.当然,由于它仅用于开发,因此许多功能从未实现过.由于微软为公众提供了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)宣布成为跨平台技术.显然,微软需要一种新的设计来支持Windows,macOS和Linux,除了IIS之外,还应考虑所有主要的Web服务器,nginx/Apache(或其他Web服务器).

我想很多人会同意微软从NodeJS那里学到很多东西,然后设计和开发了Kestrel(libuv最初的基础,但很快就会转向其他技术).它最初是像Cassini这样的轻量级Web服务器,但后来添加了更多功能(如另一个答案评论,更多功能可以被视为完整的Web服务器).虽然完全托管(存在一些本机依赖项),但它不再是像Cassini那样的玩具网络服务器.

那为什么你不能只使用红隼呢?为什么仍然需要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进程内托管".它可以被视为IIS修订版5上的ASP.NET支持.

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

  • "使用反向代理有很多理由"属于它自己的问题和答案.通常人们可以通过询问Google找到好的资源,所以我没有将其附加到这个已经足够长的答案中. (7认同)
  • 这不是一个特别明确的答案。它可以受益于彻底的语法和内容修订。 (2认同)

vcs*_*nes 102

什么是红隼

这是一个完整的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>
Run Code Online (Sandbox Code Playgroud)

这是HttpPlatformHandler.从本质上讲,这样做是将所有请求转发给Kestrel.IIS Express(以及IIS)将不再自行运行ASP.NET.相反,它们将充当代理,只是简单地从Kestrel传递请求和响应.使用IIS仍然有优势,特别是它为您提供安全配置,内核级缓存等.

  • 使用ASP.Net核心https://youtu.be/e2qZvabmSvo时,介绍了具体内容 (3认同)
  • 由于引入了ASP.NET核心模块(而不是HttpPlatformHandler),这个答案有点过时了.我提供了更多故事和相关产品的替代答案. (3认同)

Ali*_*yat 14

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

  • 另外“[Kestrel 服务器当前不提供内置压缩支持](https://learn.microsoft.com/en-us/aspnet/core/performance/response-compression?view=aspnetcore-7.0)” (2认同)

Max*_*Max 8

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

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

您可以单独使用Kestrel,也可以使用反向代理服务器,例如IIS,Nginx或Apache.反向代理服务器接收来自Internet的HTTP请求,并在进行一些初步处理后将它们转发给Kestrel.