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 应用的进程,并在应用关闭或崩溃时重新启动该应用。 这基本上与在 Windows 进程激活服务 (WAS) 托管的进程内运行的应用中出现的行为相同。

下图说明了 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 身份验证令牌。

最新文章

  1. jmeter之线程组的使用
  2. 挑子学习笔记:两步聚类算法(TwoStep Cluster Algorithm)——改进的BIRCH算法
  3. xml编辑器
  4. getter & setter
  5. C语言回顾-整型变量修饰符和一维数组
  6. {POJ}{3971}{Scales}{O(N)动态规划}
  7. PHP isset() 检测变量是否设置
  8. iOS 导航控制器返回栈中的某一控制器
  9. [jQuery编程挑战]004 针对选择框词典式排序
  10. 关于cocos2d这个东西
  11. Altium Designer 生成 Mach3 G代码的程序
  12. 初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)
  13. 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图
  14. shell脚本进阶之条件测试与条件语句
  15. vue 追书神器
  16. iOS 自定义一个常规的TabBar
  17. Ubuntu 12.04 安装socks5代理服务器dante-server
  18. Java虚拟机 垃圾收集器与内存分配策略
  19. Git 审查更改
  20. Java 基础 常用API ( 正则表达式,Date类,DateFormat类,Calendar类 )

热门文章

  1. BZOJ3671 [Noi2014]随机数生成器 【贪心】
  2. 微信小程序使用Socket
  3. php CI框架基础知识
  4. ssh中的相对路径与绝对路径的问题
  5. usaco 2000 contest 滑雪
  6. SELinux 案例 1
  7. Makefile之大型工程项目子目录Makefile的一种通用写法【转】
  8. Linux core dump file详解
  9. mapper配置文件中的动态SQL
  10. Android的简单应用(一)——PreferenceFragment实现应用的设置