asp.net 什么是Kestrel(与IIS / Express相比)

rta7y2nd  于 2023-01-14  发布在  .NET
关注(0)|答案(4)|浏览(283)

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

dwthyt8l

dwthyt8l1#

我想提供另一个答案,并提供一些历史,这样您可能会理解为什么Kestrel会出现,即使您只使用Windows和IIS。
在2000年之前ASP.NET开发的最初阶段,Microsoft显然创建了两个组件来托管ASP .NETWebForms应用程序,

  • Cassini,后来成为Visual Studio中的ASP.NET开发服务器。它是一个基于HttpListener用C#编写的完全托管的Web服务器。当然,由于它只用于开发,许多功能从未实现。随着微软向公众提供Cassini的源代码,有第三方对代码库进行了分支并添加了更多功能,这就开始了Cassini家族。
  • ASP.NET在IIS(修订版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,其中所有主要的Web服务器,除了IIS之外,nginx/Apache(或其他Web服务器)都应该考虑。
我想很多人会同意微软从NodeJS学到了很多东西,然后设计和开发了Kestrel(最初基于libuv,但可能会很快转向其他技术)。最初它是一个像Cassini一样的轻量级Web服务器,但后来添加了更多功能(就像另一个回答评论,更多的功能,所以可以被视为一个完整的网络服务器)。虽然完全管理(存在一些本机依赖项),它不再是像Cassini那样的玩具Web服务器。
那么为什么你不能只使用Kestrel?为什么IIS Express和潜在的IIS,nginx,或Apache仍然需要?这主要是当今互联网实践的结果。大多数网站使用反向代理从您的Web浏览器接收请求,然后转发到后台的应用程序服务器。

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

另一个答案已经显示了微软文档的链接,所以你可以看一看。
微软开发HttpPlatformHandler最初是为了使IIS成为Java/Python等的足够好的反向代理,所以计划将其用于ASP.NET核心。在开发过程中开始出现问题,所以后来微软专门为ASP.NET核心制作了ASP.NET核心模块。这就是IIS修订版4对ASP.NET的支持。
从ASP.NET Core 2.2开始,ASP.NET Core Module for IIS(版本2)可以在IIS工作进程(w3wp.exe)内托管.NET Core环境,与ASP.NET 2.x/4.x非常相似,这种模式称为“IIS进程内托管”,可以认为是ASP.NET在IIS修订版5上的支持。
嗯,相当长,但我希望我把所有必要的部分放在一起,你喜欢阅读它。
最近的一个更新(2023年1月)是ASP.NET Core/Kestrel可以用来托管反向代理功能本身,如the open source YARP project revealed
Kestrel/YARP现在在Microsoft Azure内部广泛使用,在许多场景中取代IIS ARR,因此现在您可以使用Kestrel/YARP托管自己的生产Web应用,而无需任何其他Web服务器(IIS/nginx/Apache)。

q9yhzks0

q9yhzks02#

红隼是什么
这是一个成熟的网络服务器,你可以只使用Kestrel来运行你的ASP.NET核心应用程序。
但当我运行网站时,系统托盘中仍显示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仍然有优势,特别是它为您提供了安全配置、内核级缓存等。

jk9hmnmh

jk9hmnmh3#

来自ms docs,网址:https://learn.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。

更新:.net core 2.1,Kestrel使用托管套接字而不是libuv

核心asp.net2.1文档可从www.example.com获得,网址为:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.1#transport-configuration
随着ASP.NETCore2.1的发布,Kestrel的默认传输不再基于Libuv,而是基于托管套接字。

lmvvr0a8

lmvvr0a84#

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

相关问题