ASP.NET Core 中的 Web 服务器实现

注意

此版本不是本文的最新版本。 有关当前版本,请参阅 本文的 .NET 9 版本

警告

此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 有关当前版本,请参阅 本文的 .NET 9 版本

重要

此信息与预发布产品相关,相应产品在商业发布之前可能会进行重大修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。

有关当前版本,请参阅 本文的 .NET 9 版本

作者 :汤姆·迪克斯特拉史蒂夫·史密斯斯蒂芬·霍尔特克里斯·罗斯

ASP.NET Core 应用与进程内 HTTP 服务器实现一起运行。 该服务器实现侦听 HTTP 请求,并以组成 HttpContext集形式,将它们呈现给应用。

ASP.NET Core 随附以下组件:

使用 IISIIS Express 时,应用要么运行:

  • 与 IIS 辅助进程( 进程内托管模型)与 IIS HTTP 服务器在同一进程中。 “进程内”建议的配置。
  • 在与 IIS 工作进程分开并由服务器托管的进程(进程外托管模型)中。

ASP.NET 核心模块是一个本机 IIS 模块,用于处理 IIS 与进程内 IIS HTTP 服务器之间的本机 IIS 请求或 Kestrel。 有关详细信息,请参阅适用于 IIS ASP.NET 核心模块(ANCM)。

Kestrel 与 HTTP.sys

与 HTTP.sys 相比,Kestrel 具有以下优势:

  • 更好的性能和内存利用率。
  • 跨平台
  • 灵活性,它是独立于操作系统进行开发和修补的。
  • 编程端口和 TLS 配置
  • 支持 PPv2 协议和其他传输方式的扩展能力。

Http.Sys 作为一个共享内核模式组件运行,并具备 Kestrel 所不具备的以下功能:

托管模型

有几种承载模型可用:

  • Kestrel自承载:Kestrel Web 服务器无需任何其他外部 Web 服务器(如 IIS 或 HTTP.sys)即可运行。

  • HTTP.sys 自承载是 Kestrel 的替代方法。 与 HTTP.sys 相比,建议使用 Kestrel,除非应用需要 Kestrel 未提供的功能。

  • IIS 进程内承载:ASP.NET Core 应用在与其 IIS 工作进程相同的进程中运行。 IIS 进程内承载相较 IIS 进程外承载提供更优的性能,因为请求并不通过环回适配器进行代理,环回适配器是一个网络接口,用于将传出的网络流量返回给同一计算机。 IIS 使用 Windows 进程激活服务(WAS)处理进程管理。

  • IIS 进程外承载:ASP.NET Core 应用在独立于 IIS 工作进程的进程中运行,而由模块来处理进程管理。 该模块在第一个请求到达时启动 ASP.NET Core 应用的进程,并在应用关闭或崩溃时重新启动该应用。 这实质上与运行进程内由 Windows 进程激活服务(WAS)管理的应用的行为相同。 使用单独的进程还可以托管同一个应用池中的多个应用。

有关详细信息,请参阅以下部分:

Kestrel

Kestrel 服务器 是默认的跨平台 HTTP 服务器实现。 Kestrel 提供了最佳性能和内存利用率,但它没有 HTTP.sys 中的某些高级功能。 有关详细信息,请参阅Kestrel和 HTTP.sys的对比,在本文档中。

使用 Kestrel:

  • 本身作为边缘服务器,处理直接来自网络(包括 Internet)的请求。

    Kestrel 在没有反向代理服务器的情况下直接与 Internet 通信

  • 使用 反向代理服务器,例如 Internet Information Services(IIS)NginxApache。 反向代理服务器接收来自 Internet 的 HTTP 请求,并将这些请求转发到 Kestrel。

    Kestrel 通过反向代理服务器(如 IIS、Nginx 或 Apache)间接与 Internet 通信

无论托管配置是否使用反向代理服务器,都是受支持的托管配置。

有关 Kestrel 何时在反向代理配置中使用的 Kestrel 配置指南和信息,请参阅 Kestrel ASP.NET Core 中的 Web 服务器

ASP.NET Core 随附以下组件:

使用 IISIIS Express 时,应用程序在独立于 IIS 工作进程的进程中运行(进程外),与 Kestrel 服务器 配合。

由于 ASP.NET Core 应用在独立于 IIS 工作进程的进程中运行,因此该模块会处理进程管理。 该模块在第一个请求到达时启动 ASP.NET Core 应用的进程,并在应用关闭或崩溃时重新启动该应用。 这实质上与运行进程内由 Windows 进程激活服务(WAS)管理的应用的行为相同。

下图说明了 IIS、ASP.NET Core 模块和进程外托管的应用之间的关系:

ASP.NET 核心模块

请求从 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 客户端。

有关 IIS 和 ASP.NET Core 模块的配置指南,请参阅以下主题:

Nginx 与 Kestrel

有关如何在 Linux 上使用 Nginx 作为反向代理服务器的信息,请参阅 在 Linux 上使用 Nginx 承载 ASP.NET Core

HTTP.sys

如果 ASP.NET Core 应用在 Windows 上运行,则 HTTP.sys 是 Kestrel 的替代选项。 与 HTTP.sys 相比,建议使用 Kestrel,除非应用需要 Kestrel 未提供的功能。 有关详细信息,请参阅 ASP.NET Core 中的HTTP.sys Web 服务器实现

HTTP.sys 直接与 Internet 通信

对于仅向内部网络公开的应用,HTTP.sys 同样适用。

HTTP.sys 直接与内部网络通信

有关 HTTP.sys 配置指南,请参阅 ASP.NET Core 中的HTTP.sys Web 服务器实现

ASP.NET Core 服务器基础结构

IApplicationBuilder 方法中提供的 Startup.Configure 公开了类型 ServerFeaturesIFeatureCollection 属性。 Kestrel 和 HTTP.sys 各自仅公开单个功能,即 IServerAddressesFeature,但是不同的服务器实现可能公开其他功能。

IServerAddressesFeature 可用于查找服务器实现在运行时绑定的端口。

自定义服务器

如果内置服务器无法满足应用需求,可以创建一个自定义服务器实现。 .NET 的开放 Web 接口(OWIN)指南演示了如何编写基于 NowinIServer实现。 只有应用使用的功能接口需要实现,但至少必须支持 IHttpRequestFeatureIHttpResponseFeature

服务器启动

集成开发环境 (IDE) 或编辑器启动以下应用时,会启动服务器:

从项目文件夹中的命令提示符启动应用时,dotnet run 将启动应用程序和服务器(仅限 Kestrel 和 HTTP.sys)。 可通过 -c|--configuration 选项指定此配置,该选项设置为 Debug(默认值)或 Release

使用 launchSettings.json 或使用工具中内置的调试程序(如 Visual Studio)启动应用时,dotnet run 文件会提供配置。 如果启动配置文件存在于 launchSettings.json 文件中,请使用 --launch-profile {PROFILE NAME} 选项和 dotnet run 命令,或在 Visual Studio 中选择配置文件。 有关详细信息,请参阅 dotnet run.NET Core 分发打包

HTTP/2 支持

在以下部署方案中,ASP.NET Core 支持 HTTP/2

  • Kestrel
    • 操作系统
      • Windows Server 2016/Windows 10 或更高版本†
      • 具有 OpenSSL 1.0.2 或更高版本的 Linux(例如,Ubuntu 16.04 或更高版本)
      • macOS 10.15 或更高版本
    • 目标框架:.NET Core 2.2 或更高版本
  • HTTP.sys
    • Windows Server 2016/Windows 10 或更高版本
    • 目标框架:不适用于 HTTP.sys 部署。
  • IIS (进程内)
    • Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
    • 目标框架:.NET Core 2.2 或更高版本
  • IIS (进程外)
    • Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
    • 面向公众的边缘服务器连接使用 HTTP/2,但与 Kestrel 的反向代理连接使用 HTTP/1.1。
    • 目标框架:不适用于 IIS 进程外部署。

†Kestrel 在 Windows Server 2012 R2 和 Windows 8.1 上对 HTTP/2 的支持有限。 支持受限是因为可在这些操作系统上使用的受支持 TLS 密码套件列表有限。 可能需要使用椭圆曲线数字签名算法 (ECDSA) 生成的证书来保护 TLS 连接。

  • Kestrel
    • 操作系统
      • Windows Server 2016/Windows 10 或更高版本†
      • 具有 OpenSSL 1.0.2 或更高版本的 Linux(例如,Ubuntu 16.04 或更高版本)
      • macOS 的未来版本将支持 HTTP/2。
    • 目标框架:.NET Core 2.2 或更高版本
  • HTTP.sys
    • Windows Server 2016/Windows 10 或更高版本
    • 目标框架:不适用于 HTTP.sys 部署。
  • IIS (进程内)
    • Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
    • 目标框架:.NET Core 2.2 或更高版本
  • IIS (进程外)
    • Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
    • 面向公众的边缘服务器连接使用 HTTP/2,但与 Kestrel 的反向代理连接使用 HTTP/1.1。
    • 目标框架:不适用于 IIS 进程外部署。

†Kestrel 在 Windows Server 2012 R2 和 Windows 8.1 上对 HTTP/2 的支持有限。 支持受限是因为可在这些操作系统上使用的受支持 TLS 密码套件列表有限。 可能需要使用椭圆曲线数字签名算法 (ECDSA) 生成的证书来保护 TLS 连接。

  • Kestrel
    • 操作系统
      • Windows Server 2016/Windows 10 或更高版本†
      • 具有 OpenSSL 1.0.2 或更高版本的 Linux(例如,Ubuntu 16.04 或更高版本)
      • macOS 的未来版本将支持 HTTP/2。
    • 目标框架:.NET Core 2.2 或更高版本
  • HTTP.sys
    • Windows Server 2016/Windows 10 或更高版本
    • 目标框架:不适用于 HTTP.sys 部署。
  • IIS (进程内)
    • Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
    • 目标框架:.NET Core 2.2 或更高版本
  • IIS (进程外)
    • Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
    • 面向公众的边缘服务器连接使用 HTTP/2,但与 Kestrel 的反向代理连接使用 HTTP/1.1。
    • 目标框架:不适用于 IIS 进程外部署。

†Kestrel 在 Windows Server 2012 R2 和 Windows 8.1 上对 HTTP/2 的支持有限。 支持受限是因为可在这些操作系统上使用的受支持 TLS 密码套件列表有限。 可能需要使用椭圆曲线数字签名算法 (ECDSA) 生成的证书来保护 TLS 连接。

  • HTTP.sys
    • Windows Server 2016/Windows 10 或更高版本
    • 目标框架:不适用于 HTTP.sys 部署。
  • IIS (进程外)
    • Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
    • 面向公众的边缘服务器连接使用 HTTP/2,但与 Kestrel 的反向代理连接使用 HTTP/1.1。
    • 目标框架:不适用于 IIS 进程外部署。

HTTP/2 连接必须使用 Application-Layer 协议协商 (ALPN) 和 TLS 1.2 或更高版本。 有关详细信息,请参阅与服务器部署方案相关的主题。

企业 Web 应用模式

有关创建可靠、安全、高性能、可测试且可缩放 ASP.NET 核心应用的指南,请参阅 企业 Web 应用模式。 可以提供实现这些模式的完整生产级示例 Web 应用。

其他资源