什么是Kestrel(vs IIS / Express)

什么是红隼web服务器,它与IIS / IIS Express有什么关系?

我来自在IIS Express上开发应用程序并将其托pipe在IIS Web服务器上。 与ASP.NET核心我有一个依赖于Microsoft.AspNetCore.Server.Kestrel和我的启动.UseServer("Microsoft.AspNetCore.Server.Kestrel") 。 但是当我运行我的网站,我仍然得到系统托盘中的IIS Express图标。 有人问我是否使用IIS Express或Kestrel,我不知道该说些什么!

我没有任何跨平台的需求,因为我在Azure的个人电脑和主机上开发,所以如果我甚至need Kestrel,我感到困惑,但似乎没有其他select – 即使是最简单的样本使用Kestrel。

什么是红隼

这是一个完整的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还有一些优点,特别是它提供了安全configuration,内核级caching等。

我想提供一个替代的答案,有一些历史,所以你可以理解为什么红隼来。

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

  • Cassini后来成为Visual Studio中的ASP.NET Development Server。 它是一个基于HttpListener C#编写的完全托pipe的Web服务器。 当然,由于只是为了开发,许多function从来没有实现过。 当微软公开提供卡西尼的源代码时,有第三方派生代码库,并增加了更多的function,启动了卡西尼家族。
  • 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应用程序被托pipe在IIS工作进程w3wp.exe

  • 在IIS 7及以上版本中引入集成pipe道需要进一步的修改,用webengine4.dll代替aspnet_isapi.dll 。 这可以被看作IIS修订版本3上的ASP.NET支持。ASP.NET和IISpipe道是统一的。

你可以看到ASP.NET已经变得更加复杂,并与IIS紧密集成,所以Cassini开始展现它的年代,并逐渐被IIS Express(一个用户模式lite IIS)所取代。

因此,在许多情况下,当人们指责ASP.NET很慢的时候,实际上他们应该责怪ASP.NET。 没有ASP.NET的IIS本身是非常快速和稳定的,而ASP.NET并没有考虑到足够的性能指标(因为WebForms关注了很多生产力和RAD)。

然后在2014年11月,ASP.NET 5(后来更名为ASP.NET Core)宣布成为一个跨平台技术。 微软显然无法将其绑定到IIS。 所以新的devise必须考虑使用nginx / Apache或其他Web服务器的macOS和Linux。

我想很多人会同意,微软从libuv学到很多东西,然后devise和开发Kestrel(最初基于libuv但可能很快会转向其他技术)。 它最初是一个轻量级的Web服务器,比如Cassini,但后来又添加了更多的function(如另一个回答评论,更多的function可以被视为一个完整的Web服务器)。 虽然完全托pipe(一些本地依赖存在),它不再像卡西尼玩具networking服务器。

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

  • 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支持。

那么很长,但我希望我把所有必要的作品放在一起,你喜欢阅读。

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

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

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