一. 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.
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("http://localhost:5000");
});
五. http/2.0支持
以下部署方案中的 http://ASP.NET Core 支持 HTTP/2
总结:
(1) http://ASP.NET Core Module模块是适应于windows平台上的iis。
(2) 进程内托管模型是使用 IISHttpServer是适应于windows平台上 IIS 的进程内服务器,。将http://ASP.NET Core Module接收的请求转换为托管的 IIS 进程内服务器实现。用IISHttpServer服务器。
(3) 进程外托管模型是独立于iis, 可以做反向代理, 用Kestrel 服务器,可以应用在windows或linux平台上。
(4) 如果 http://ASP.NET Core 应用在 Windows 上运行,则 HTTP.sys 是 Kestrel 的替代选项。为了获得最佳性能,通常建议使用 Kestrel。
(5) Kestrel 是 http://ASP.NET Core 项目模板中默认 Web 服务器.可以结合反向代理服务器一起使用(如 Internet Information Services (IIS)、Nginx 或 Apache)。
参考文献:
http://ASP.NET Core 中的 Kestrel Web 服务器参数设置
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.2
http://ASP.NET Core 中的 HTTP.sys Web 服务器参数设置
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/httpsys?view=aspnetcore-2.2
关于http://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 上托管 http://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
欢迎添加个人微信号:Like若所思。
欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!