asp 执行 exe_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>

33a4517e6b29857f93fa4b5d6f1319e7.png

二. 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和进程内托管的应用之间的关系:

d88c51dc731c0cefe5ddc5debdbd9b3d.png

     http://ASP.NET Core Module接收本机请求,并将它传递给 IISHttpServerIISHttpServer 将请求从本机转换为托管的 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和进程外托管的应用之间的关系:

e9d3e4cb2220dee9758bb4023c13006f.png

    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)的请求。    

a81373783029553aa040f6eb6ab739e6.png

    (2) 与反向代理服务器(如 Internet Information Services (IIS)、Nginx 或 Apache)结合使用。 反向代理服务器接收来自 Internet 的 HTTP 请求,并将这些请求转发到 Kestrel。

da32d05c832e9c5c8038b9e6d19b28d5.png

三. 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。

16224851688390f0f75bcf5c78b8e98f.png

  配置 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

6deb31701a9f79312eb0b6b089514a4d.png

e2958e457cedba0f50c15364805a5616.png


  总结: 
(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若所思。

欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!

e3d05804d41dec4ad15613f55ccabcbd.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值