asp.net core 系列 18 web服务器实现
一. http:// ASP.NET Core Module
在介绍 http:// ASP.NET Core Web实现之前,先来了解下 http:// ASP.NET Core Module。该模块是插入 IIS 管道的本机 IIS 模块(本机是指程序所部署的服务器)。是基于windows平台处理 IIS和进程内IISHttpServer或Kestrel。用于:
(1) 在 IIS 工作进程 (w3wp.exe) 内托管 http:// ASP.NET Core 应用,称为进程内托管模型。
(2) 将 Web 请求转发到运行 Kestrel 服务器的后端 http:// ASP.NET Core 应用,称为进程外托管模型。
在进程内托管时,该模块会使用 IIS 进程内服务器实现,即IISHttpServer。在进程外托管时,该模块仅适用于 Kestrel。 该模块与 HTTP.sys 不兼容。关于IIS 在 Windows 上托管 http:// ASP.NET Core。安装 http:// ASP.NET Core Model,在 " http:// asp.net core 系列 9 环境" 中有介绍。
--发布到iis上的配置节点
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
二. windows平台web服务器介绍
在windows平台下, http:// 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
使用进程内宿主, http:// ASP.NET Core应用程序运行在与其IIS worker进程相同的进程中。进程内托管比进程外托管提供了更好的性能,因为请求不会通过环回适配器进行代理,环回适配器是一个网络接口,将传出的网络流量返回到同一台机器。
由 http:// ASP.NET Core Module执行应用初始化:(1)加载CoreCLR、(2)调用 Program.Main。以及处理 IIS 本机请求的生存期。
下图说明了 IIS、 http:// ASP.NET Core Module和进程内托管的应用之间的关系:
http://
ASP.NET
Core Module接收本机请求,并将它传递给
IISHttpServer
。
IISHttpServer
将请求从本机转换为托管的 IIS 进程内服务器实现。
IISHttpServer
处理请求之后,请求会被推送到 ASP.NET Core 中间件管道中。 中间件管道处理该请求并将其作为
HttpContext
实例传递给应用的逻辑(Application code)。 应用的响应传递回 IIS,IIS 将响应推送回发起请求的客户端。
1.2 进程外托管模型 Out-of-process hosting model
因为 http:// ASP.NET Core运行在独立于IIS工作进程的进程中, 因此该模块负责进程管理。该模块在第一个请求到达时启动 http:// ASP.NET Core 应用的进程,并在应用关闭或崩溃时重新启动该应用。
下图说明了 IIS、 http:// ASP.NET Core Module和进程外托管的应用之间的关系:
http://
ASP.NET
Core Module在启动时通过环境变量指定端口,IIS 集成中间件将服务器配置为侦听
http://localhost:{PORT}
。 执行其他检查,拒绝不是来自该ASP.NET Core Module的请求。
Kestrel 从
http://
ASP.NET
Core Module获取请求后,请求会被推送到
http://
ASP.NET
Core 中间件管道中。 中间件管道处理该请求并将其作为
HttpContext
实例传递给应用的逻辑(Application code)。 IIS 集成添加的中间件会将方案、远程 IP 和 pathbase 更新到帐户以将请求转发到 Kestrel。 应用的响应传递回 IIS,IIS 将响应推送回发起请求的 HTTP 客户端。
最后对于非windows平台, http:// asp.net core使用Kestrel Web服务器。这是默认跨平台 HTTP 服务器实现。
二. Kestrel 服务器
Kestrel 是 http:// ASP.NET Core 项目模板中包括的默认 Web 服务器。默认情况下, http:// ASP.NET Core 项目模板使用 Kestrel。 在 Program.cs 中,模板代码调用 CreateDefaultBuilder,后者在后台调用 UseKestrel。Kestrel 的使用方式如下:
(1) 它本身就是一个边缘服务器,直接处理来自网络(包括Internet)的请求。
(2) 与反向代理服务器(如 Internet Information Services (IIS)、Nginx 或 Apache)结合使用。 反向代理服务器接收来自 Internet 的 HTTP 请求,并将这些请求转发到 Kestrel。
三. IISHTTPServer 服务器
IISHTTPServer是 IIS 的进程内服务器且为进程内部署所必需。 http:// 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服务器
如果 http:// ASP.NET Core 应用在 Windows 上运行,则 HTTP.sys 是 Kestrel 的替代选项。为了获得最佳性能,通常建议使用 Kestrel。 在应用向 Internet 公开且所需功能受 HTTP.sys(而不是 Kestrel)支持的方案中,可以使用 HTTP.sys。
配置 http:// 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.