ASP.NET Core 应用与进程内的 HTTP 服务器实现一起运行.该服务器实现侦听 HTTP 请求,并在一系列请求功能被写到 HttpContext 时,将这些请求展现到应用中.
ASP.NET Core 随附两种服务器实现:
- Kestrel 是适用于 ASP.NET Core 的默认跨平台 HTTP 服务器.
- HTTP.sys 是仅适用于 Windows 的 HTTP 服务器,它基于 HTTP.sys 核心驱动程序和 HTTP 服务器 API.在 ASP.NET 1.x 中被命名为 WebListener.
ASP.NET Core 模块是本机 IIS 模块,用于处理 IIS 和进程内 IIS HTTP 服务器(HTTP.sys)或 Kestrel 之间的本机 IIS 请求。
使用 IIS 或 IIS Express 时,应用会在以下其中一个进程中运行:
- 在与 IIS 工作进程(进程内托管模型)和 IIS HTTP 服务器相同的进程中.
- 在独立于 IIS 工作进程(进程外托管模型)和 Kestrel 服务器的进程中.
托管模型
进程内托管模型
使用进程内托管,ASP.NET Core 在与其 IIS 工作进程相同的进程中运行。 这样可消除通过环回适配器代理请求时的进程外性能损失,环回适配器是一个网络接口,用于将传出的网络流量返回给同一计算机。 IIS 使用 Windows 进程激活服务 (WAS) 处理进程管理。
ASP.NET Core 模块:
- 执行应用初始化。
- 加载 CoreCLR。
- 调用
Program.Main
。
- 处理 IIS 本机请求的生存期。
下图说明了 IIS、ASP.NET Core 模块和进程内托管的应用之间的关系:
请求从 Web 到达内核模式 HTTP.sys 驱动程序。 驱动程序将本机请求路由到网站的配置端口上的 IIS,通常为 80 (HTTP) 或 443 (HTTPS)。 该模块接收本机请求,并将它传递给 IIS HTTP 服务器 (IISHttpServer
)。 IIS HTTP 服务器是将请求从本机转换为托管的 IIS 进程内服务器实现。
IIS HTTP 服务器处理请求之后,请求会被推送到 ASP.NET Core 中间件管道中。 中间件管道处理该请求并将其作为 HttpContext
实例传递给应用的逻辑。 应用的响应传递回 IIS,IIS 将响应推送回发起请求的客户端。
进程内托管选择使用现有应用,但 dotnet new 模板默认使用所有 IIS 和 IIS Express 方案的进程内托管模型。(但是看源码,貌似默认的是进程外托管模型喃)
进程外托管模型
由于 ASP.NET Core 应用在独立于 IIS 工作进程的进程中运行,因此该模块会处理进程管理。 该模块在第一个请求到达时启动 ASP.NET Core 应用的进程,并在应用关闭或崩溃时重新启动该应用。 这基本上与在 托管的进程内运行的应用中出现的行为相同。
下图说明了 IIS、ASP.NET Core 模块和进程外托管的应用之间的关系:
请求从 Web 到达内核模式 HTTP.sys 驱动程序。 驱动程序将请求路由到网站的配置端口上的 IIS,通常为 80 (HTTP) 或 443 (HTTPS)。 该模块将该请求转发到应用的随机端口(非端口 80/443)上的 Kestrel。
该模块在启动时通过环境变量指定端口,IIS 集成中间件将服务器配置为侦听 http://localhost:{PORT}
。 执行其他检查,拒绝不是来自该模块的请求。 该模块不支持 HTTPS 转发,因此即使请求由 IIS 通过 HTTPS 接收,它们还是通过 HTTP 转发。
Kestrel 从模块获取请求后,请求会被推送到 ASP.NET Core 中间件管道中。 中间件管道处理该请求并将其作为 HttpContext
实例传递给应用的逻辑。 IIS 集成添加的中间件会将方案、远程 IP 和 pathbase 更新到帐户以将请求转发到 Kestrel。 应用的响应传递回 IIS,IIS 将响应推送回发起请求的 HTTP 客户端。
ASP.NET Core 模块具有一些其他功能。 该模块可以:
- 为工作进程设置环境变量。
- 将 stdout 输出记录到文件存储器,以解决启动问题。
- 转发 Windows 身份验证令牌。