一.ASP.NET Core Module
在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module。该模块是插入 IIS 管道的本机 IIS 模块(本机是指程序所部署的服务器)。是基于windows平台处理 IIS和进程内IISHttpServer或Kestrel。用于:
(1) 在 IIS 工作进程 (w3wp.exe) 内托管 ASP.NET Core 应用,称为进程内托管模型。
(2) 将 Web 请求转发到运行 Kestrel 服务器的后端 ASP.NET Core 应用,称为进程外托管模型。
在进程内托管时,该模块会使用 IIS 进程内服务器实现,即IISHttpServer。在进程外托管时,该模块仅适用于 Kestrel。 该模块与 HTTP.sys 不兼容。关于IIS 在 Windows 上托管 ASP.NET Core。安装ASP.NET Core Model,在 "asp.net core 系列 9 环境" 中有介绍。
--发布到iis上的配置节点 <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers>
二. windows平台web服务器介绍
在windows平台下,asp.net core有以下几种HTTP 服务器组件:
(1) Kestrel服务器是默认跨平台 HTTP 服务器实现。
(2) IISHttpServer 是IIS 的进程内服务器。
(3) HTTP.sys 服务器是仅用于 Windows 的 HTTP 服务器,它基于 HTTP.sys 核心驱动程序和 HTTP 服务器 API。
当使用 IIS 或 IIS Express 时,应用程序会在以下其中一个进程中运行:
(1) 在IIS工作进程(进程内宿主模型)与IIS HTTP服务器的相同进程中。推荐配置为In-process(用于windows上进程内托管)。
(2) 独立于IIS工作进程(进程外宿主模型)的进程中使用Kestrel服务器。配置为OutOfProcess
1.1 进程内托管模型 In-process hosting model
使用进程内宿主,ASP.NET Core应用程序运行在与其IIS worker进程相同的进程中。进程内托管比进程外托管提供了更好的性能,因为请求不会通过环回适配器进行代理,环回适配器是一个网络接口,将传出的网络流量返回到同一台机器。
由ASP.NET Core Module执行应用初始化:(1)加载CoreCLR、(2)调用 Program.Main。以及处理 IIS 本机请求的生存期。
下图说明了 IIS、ASP.NET Core Module和进程内托管的应用之间的关系:
ASP.NET Core Module接收本机请求,并将它传递给 IISHttpServer
。 IISHttpServer
将请求从本机转换为托管的 IIS 进程内服务器实现。
IISHttpServer
处理请求之后,请求会被推送到 ASP.NET Core 中间件管道中。中间件管道处理该请求并将其作为HttpContext
实例传递给应用的逻辑(Application code)。应用的响应传递回 IIS,IIS 将响应推送回发起请求的客户端。
1.2 进程外托管模型 Out-of-process hosting model
因为ASP.NET Core运行在独立于IIS工作进程的进程中, 因此该模块负责进程管理。该模块在第一个请求到达时启动 ASP.NET Core 应用的进程,并在应用关闭或崩溃时重新启动该应用。
下图说明了 IIS、ASP.NET Core Module和进程外托管的应用之间的关系:
ASP.NET Core Module在启动时通过环境变量指定端口,IIS 集成中间件将服务器配置为侦听http://localhost:{PORT}
。执行其他检查,拒绝不是来自该ASP.NET Core Module的请求。
Kestrel 从ASP.NET Core Module获取请求后,请求会被推送到 ASP.NET Core 中间件管道中。中间件管道处理该请求并将其作为HttpContext
实例传递给应用的逻辑(Application code)。IIS 集成添加的中间件会将方案、远程 IP 和 pathbase 更新到帐户以将请求转发到 Kestrel。应用的响应传递回 IIS,IIS 将响应推送回发起请求的 HTTP 客户端。
最后对于非windows平台, asp.net core使用Kestrel Web服务器。这是默认跨平台 HTTP 服务器实现。
二. Kestrel 服务器
Kestrel 是 ASP.NET Core 项目模板中包括的默认 Web 服务器。默认情况下,ASP.NET Core 项目模板使用 Kestrel。 在 Program.cs 中,模板代码调用 CreateDefaultBuilder,后者在后台调用 UseKestrel。Kestrel 的使用方式如下:
(1) 它本身就是一个边缘服务器,直接处理来自网络(包括Internet)的请求。
(2) 与反向代理服务器(如 Internet Information Services (IIS)、Nginx 或 Apache)结合使用。 反向代理服务器接收来自 Internet 的 HTTP 请求,并将这些请求转发到 Kestrel。
三. IISHTTPServer 服务器
IISHTTPServer是 IIS 的进程内服务器且为进程内部署所必需。 ASP.NET Core Module 用于处理 IIS 和 IISHTTPServer之间的本机 IIS 请求。
若要配置用于进程内托管的应用,请将<AspNetCoreHostingModel>
属性添加到值为InProcess
(进程外托管使用OutOfProcess
进行设置)的应用项目文件。如果文件中不存在<AspNetCoreHostingModel>
属性,则默认值为OutOfProcess
<PropertyGroup> <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel> </PropertyGroup>
InProcess时使用 IIS HTTP 服务器 (IISHttpServer) 而不是 Kestrel 服务器。OutOfProcess时使用 Kestrel 服务器,而不是 IIS HTTP 服务器 (IISHttpServer)
四. HTTP.sys服务器
如果 ASP.NET Core 应用在 Windows 上运行,则 HTTP.sys 是 Kestrel 的替代选项。为了获得最佳性能,通常建议使用 Kestrel。在应用向 Internet 公开且所需功能受 HTTP.sys(而不是 Kestrel)支持的方案中,可以使用 HTTP.sys。
配置 ASP.NET Core 应用以使用 HTTP.sys。构建 Web 主机时调用 UseHttpSys 扩展方法,同时指定所需的 HTTP.sys 选项。在 Visual Studio 中,默认启动配置文件是针对 IIS Express 的。若要作为控制台应用运行该项目,请手动更改所选配置文件。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseHttpSys(options => { //The following options are set to default values. options.Authentication.Schemes =AuthenticationSchemes.None; options.Authentication.AllowAnonymous = true; options.MaxConnections = null; options.MaxRequestBodySize = 30000000; options.UrlPrefixes.Add("http://localhost:5000"); });
五. http/2.0支持
以下部署方案中的 ASP.NET Core 支持 HTTP/2
Kestrel | 操作系统: Windows Server 2016/Windows 10 或更高版本 具有 OpenSSL 1.0.2 或更高版本的 Linux macOS 的未来版本将支持 HTTP/2 | 目标框架: .NET Core 2.2 或更高版本 |
HTTP.sys | 操作系统: Windows Server 2016/Windows 10 或更高版本 | 目标框架: 不适用于 HTTP.sys部署。 |
IIS(进程内) | 操作系统: Windows Serve IIS 10 或更高版本 IIS 10 或更高版本 | 目标框架: .NET Core 2.2 或更高版本 |
IIS(进程外) | 操作系统: Windows Serve IIS 10 或更高版本 IIS 10 或更高版本 面向公众的边缘服务器连接使用 HTTP/2,但与 Kestrel 的反向代理连接使用 HTTP/1.1。 | 目标框架: 不适用于 IIS 进程外部署。 |
总结:
(1) ASP.NET Core Module模块是适应于windows平台上的iis。
(2) 进程内托管模型是使用 IISHttpServer是适应于windows平台上 IIS 的进程内服务器,。将ASP.NET Core Module接收的请求转换为托管的 IIS 进程内服务器实现。用IISHttpServer服务器。
(3) 进程外托管模型是独立于iis, 可以做反向代理,用Kestrel 服务器,可以应用在windows或linux平台上。
(4) 如果 ASP.NET Core 应用在 Windows 上运行,则 HTTP.sys 是 Kestrel 的替代选项。为了获得最佳性能,通常建议使用 Kestrel。
(5) Kestrel 是 ASP.NET Core 项目模板中默认 Web 服务器.可以结合反向代理服务器一起使用(如 Internet Information Services (IIS)、Nginx 或 Apache)。
参考文献:
ASP.NET Core 中的 Kestrel Web 服务器参数设置
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.2
ASP.NET Core 中的 HTTP.sys Web 服务器参数设置
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/httpsys?view=aspnetcore-2.2
关于ASP.NET Core 中的aspnet-core-module
https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.2
使用 Nginx 在 Linux 上托管 ASP.NET Core
https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.2
关于Linux 上 .NET Core 的先决条件
https://docs.microsoft.com/zh-cn/dotnet/core/linux-prerequisites?tabs=netcore2x